Optimize live plotting with a large data set

11 次查看(过去 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

回答(1 个)

Les Beckham
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.
You might also want to try the animated line function.
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 个评论
Khang Nguyen
Khang Nguyen 2023-9-8
I have multiple plots like this I want to update at the same time! I am not sure how to include them using your method!
Les Beckham
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 CenterFile Exchange 中查找有关 Line Plots 的更多信息

产品


版本

R2023a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by