Optimize live plotting with a large data set
조회 수: 12 (최근 30일)
이전 댓글 표시
Hi,
I have a large data set (16 000 datas) that I am trying do a live plots. But I notice that it getting slower as the code progress, are there anyway to optimize it and make the code faster?
function [] = live_plot(table)
% this function will perfrom live plotting using an input array
graph_len = size(table);
figure
for i = 2:graph_len(1)
% graph number 1
subplot(2,1,1)
hold on
plot(table(i-1:i,1),table(i-1:i,2), "b")
plot(table(i-1:i,1),table(i-1:i,3), '--', 'Color',[1 0 0])
hold off
%graph number 2
subplot(2,1,2)
hold on
plot(table(i-1:i,1),table(i-1:i,4), "b")
plot(table(i-1:i,1),table(i-1:i,5), '--', 'Color',[1 0 0])
hold off
pause(0.00001)
end
end
댓글 수: 0
답변 (1개)
Les Beckham
2023년 9월 8일
편집: Les Beckham
2023년 9월 8일
You definitely don't want to call plot repeatedly inside your loop.
Here is a suggested approach where I created the plot outside the loop and then just update the data for each of the lines in the plot during the loop. Note that running this in Answers won't show the animation. It will just show the final result.
This definitely runs faster than your current code (I tried it on my desktop Matlab).
Adapt as needed.
t = (0:1e-3:6*pi).';
data = [t sin(t) cos(t) 2*sin(t) -2*cos(t)]; % example data (18850 rows of data)
figure
% initially, just plot the first two points to initialize the plot
h = plot(data(1:2,1), data(1:2,2), data(1:2,1), data(1:2,3), data(1:2,1), data(1:2,4), data(1:2,1), data(1:2,5));
grid on
xlim([0 max(t)]) % manually set the x and y limits so Matlab won't automatically adjust while looping
ylim([1.5*min(min(data(:,2:5))) 1.5*max(max(data(:,2:5)))])
for i = 3:numel(t)
for iLine = 1:numel(h)
h(iLine).XData = [h(iLine).XData data(i,1)]; % add points one-by-one to the existing lines
h(iLine).YData = [h(iLine).YData data(i,iLine+1)];
end
drawnow limitrate
end
댓글 수: 2
Les Beckham
2023년 9월 8일
You just need to keep the handles to each of the subplots and then update as I did above.
Here's an example.
t = (0:1e-3:6*pi).';
data = [t sin(t) cos(t) 2*sin(t) -2*cos(t)];
figure
num_subplots = 4;
for iPlot = 1:num_subplots % create the subplots and plot the first two points to initialize the plot
hs = subplot(2,2,iPlot);
h(iPlot) = plot(data(1:2,1), data(1:2,iPlot+1));
set(hs, 'XLim', [0 max(t)])
set(hs, 'YLim', [1.5*min(min(data(:,iPlot+1))) 1.5*max(max(data(:,iPlot+1)))])
grid on
end
for i = 3:numel(t)
for iLine = 1:numel(h)
h(iLine).XData = [h(iLine).XData data(i,1)]; % add points one-by-one to the existing lines
h(iLine).YData = [h(iLine).YData data(i,iLine+1)];
end
drawnow limitrate
end
참고 항목
카테고리
Help Center 및 File Exchange에서 Line Plots에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!