我是matlab的新手,希望实时绘制一些数据。我的方法如下:
figure;
hold on;
for i = 1:1000;
plot(i, i);
drawnow;
end
但它的性能很差。
我在stackoverflow上还发现了一个建议:https://stackoverflow.com/q/3118918/1066838,但是只有最后一组数据被绘制,所以我总是只能看到图上的一个点。
我是matlab的新手,希望实时绘制一些数据。我的方法如下:
figure;
hold on;
for i = 1:1000;
plot(i, i);
drawnow;
end
但它的性能很差。
我在stackoverflow上还发现了一个建议:https://stackoverflow.com/q/3118918/1066838,但是只有最后一组数据被绘制,所以我总是只能看到图上的一个点。
不要使用高级的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
,因此您需要相应地处理数据。但最终,一旦你获得了想要在特定时间绘制的数据集,只需设置线条的整个XData
和YData
即可。set
调用会变得有些笨重,因为我们必须每次都设置线条的数据,而不是追加它。 (但它肯定比使用plot
快。)这取决于您的数据集更改频率如何,可能已经足够好了。有关详细信息,请参见 此问题 。 animatedline
对象使得从流数据中绘制点更加容易: animatedline
函数创建初始动画线之后,可以向该线添加新点,而无需重新定义现有点。通过设置其属性,修改动画线的外观。figure;
hold on;
for i = 1:1000;
clf;
plot(x(1:i), y(1:i));
drawnow;
end
clf
,速度会变得非常慢。试试看吧。 - Oli
end
之前(且在set
之后),不应该加上drawnow
命令吗? - István Zachardrawnow
也一直能正常工作。 - Dang Khoa