快速绘图

顺序绘图或动画有三种主要方式:plot(x,y)set(h , 'XData' , y, 'YData' , y)animatedline。如果你希望动画平滑,则需要高效绘图,这三种方法并不相同。

% Plot a sin with increasing phase shift in 500 steps
x = linspace(0 , 2*pi , 100);

figure
tic
for thetha = linspace(0 , 10*pi , 500)
    y = sin(x + thetha);
    plot(x,y)
    drawnow
end
toc

我得到了 5.278172 seconds。绘图函数基本上每次都删除并重新创建线对象。更新绘图的更有效方法是使用 Line 对象的 XDataYData 属性。

tic
h = [];   % Handle of line object
for thetha = linspace(0 , 10*pi , 500)
    y = sin(x + thetha);
    
    if isempty(h)
        % If Line still does not exist, create it
        h = plot(x,y);
    else
        % If Line exists, update it
        set(h , 'YData' , y)
    end
    drawnow
end
toc

现在我得到 2.741996 seconds,好多了!

animatedline 是一个相对较新的功能,于 2014b 推出。让我们看看它的票价:

tic
h = animatedline;
for thetha = linspace(0 , 10*pi , 500)
    y = sin(x + thetha);
    clearpoints(h)
    addpoints(h , x , y)
    drawnow
end
toc

3.360569 seconds,不如更新现有的情节,但仍然比 plot(x,y) 好。

当然,如果你必须绘制一条线,就像在这个例子中一样,这三种方法几乎是等效的,并给出了平滑的动画。但是如果你有更复杂的图,那么更新现有的 Line 对象会有所不同。