Matlab实时绘图

7

我是matlab的新手,希望实时绘制一些数据。我的方法如下:

figure;
hold on;

for i = 1:1000;
   plot(i, i);
   drawnow;
end

但它的性能很差。

我在stackoverflow上还发现了一个建议:https://stackoverflow.com/q/3118918/1066838,但是只有最后一组数据被绘制,所以我总是只能看到图上的一个点。

2个回答

21

不要使用高级的plot函数,考虑在循环中调整线条句柄属性,特别是XDataYData

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来生成数据集;我假设对于实时绘图,您有一些要绘制的DatasetXDatasetY,因此您需要相应地处理数据。但最终,一旦你获得了想要在特定时间绘制的数据集,只需设置线条的整个XDataYData即可。
最后,请注意,对于非常大的数据集,这个set调用会变得有些笨重,因为我们必须每次都设置线条的数据,而不是追加它。 (但它肯定比使用plot快。)这取决于您的数据集更改频率如何,可能已经足够好了。有关详细信息,请参见 此问题
编辑:从MATLAB R2014b开始, animatedline 对象使得从流数据中绘制点更加容易:
动画线对象通过从流数据源中积累数据来优化线动画。使用animatedline函数创建初始动画线之后,可以向该线添加新点,而无需重新定义现有点。通过设置其属性,修改动画线的外观。

奇怪的是,对我来说它不会实时绘图,而是等待计算完成,然后显示绘图。有什么想法吗? - István Zachar
end之前(且在set之后),不应该加上drawnow命令吗? - István Zachar
也许吧。不过,对我来说,没有 drawnow 也一直能正常工作。 - Dang Khoa

0
为了提高性能,您应该使用clf,它会清除图形。否则所有的绘图都会堆叠在一起。
如果您想实时进行plot(x,y),您应该这样做:
figure;
hold on;

for i = 1:1000;
   clf;
   plot(x(1:i), y(1:i));
   drawnow;
end

@SamuelNLP,这确实有帮助。我已经多次使用它了,如果去掉clf,速度会变得非常慢。试试看吧。 - Oli

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接