我是matlab的新手,我想实时绘制一些数据。 我的方法如下:
figure;
hold on;
for i = 1:1000;
plot(i, i);
drawnow;
end
但表现不佳。
我还在stackoverflow上找到了一个建议:https://stackoverflow.com/q/3118918/1066838 但是只绘制了最后设定的数据,所以我看到图中只有一个点。
答案 0 :(得分:21)
请考虑在循环中调整line handle properties,更具体地说plot
和XData
,而不是进行高级YData
调用:
figure(1);
lHandle = line(nan, nan); %# Generate a blank line and return the line handle
for i = 1:1000
X = get(lHandle, 'XData');
Y = get(lHandle, 'YData');
X = [X i];
Y = [Y i];
set(lHandle, 'XData', X, 'YData', Y);
end
这样做,代码前/后的tic
/ toc
给出0.09秒;你可能已经看到了一个天真的plot
,它的运行时间接近20秒。
请注意,我在此示例中仅使用get
来生成数据集;我假设你有一个实时情节,你有一些DatasetX
和DatasetY
来绘制,所以你需要相应地处理你的数据。但最后,一旦你有了想要在特定时间绘制的数据集,只需set
该行的整个XData
和YData
。
最后,请注意,对于非常大的数据集,此set
调用有点笨拙,因为我们必须每次都设置行数据而不是追加到它。 (但它肯定比使用plot
更快。)这可能足够好,具体取决于数据集更改的频率。有关详细信息,请参阅this question。
编辑:从MATLAB R2014b开始,animinatedline
对象可以更容易地绘制来自流数据的点:
动画线对象通过累积来自流数据源的数据来优化线动画。使用animatedline函数创建初始动画线后,可以向线添加新点,而无需重新定义现有点。通过设置其属性来修改动画线的外观。
答案 1 :(得分:0)
为了提高性能你应该使用clf,它会清除数字。否则所有的情节都会叠加在一起。
如果你想实时plot(x,y)
,你应该这样做:
figure;
hold on;
for i = 1:1000;
clf;
plot(x(1:i), y(1:i));
drawnow;
end