Matlab 使用多条数据线/曲线更新绘图

问题描述 投票:0回答:3

我想尽快更新具有多条数据线/曲线的绘图。我见过一些更新绘图的方法,例如使用:

h = plot(x,y);
set(h,'YDataSource','y')
set(h,'XDataSource','x')
refreshdata(h,'caller');

set(h,'XData',x,'YData',y);

对于单条曲线来说它效果很好,但是我不仅想更新一条数据曲线,而且还想更新多条数据曲线。我该怎么做?

matlab matlab-figure
3个回答
9
投票

如果使用单个

plot
命令创建多个绘图对象,则
plot
返回的句柄实际上是 绘图对象数组(每个绘图一个)。

plots = plot(rand(2));
size(plots)

    1   2

因此,您不能简单地将另一个 [2x2] 矩阵分配给

XData

set(plots, 'XData', rand(2))

可以通过以下语法将新 XData 的元胞数组传递到绘图。仅当您已在元胞数组中包含新值时,这才真正方便。

set(plots, {'XData'}, {rand(1,2); rand(1,2)})

其他选项是使用新值单独更新每个绘图对象。就快速执行此操作而言,不一次全部设置它们实际上不会对性能造成太大影响,因为它们实际上不会被渲染,直到 MATLAB 空闲或您显式调用

drawnow

X = rand(2);
Y = rand(2);

for k = 1:numel(plots)
    set(plots(k), 'XData', X(k,:), 'YData', Y(k,:))
end

% Force the rendering *after* you update all data
drawnow

如果您确实想使用您所展示的

XDataSource
YDataSource
方法,您实际上可以这样做,但您需要为 each 绘图对象指定唯一的数据源。

% Do this when you create the plots
for k = 1:numel(plots)
    set(plots(k), 'XDataSource', sprintf('X(%d,:)', k), ...
                  'YDataSource', sprintf('Y(%d,:)', k))
end

% Now update the plot data
X = rand(2);
Y = rand(2);

refreshdata(plots)

1
投票

您可以使用

drawnow

%Creation of the vectors

x = 1:100;
y = rand(1,100);

%1st plot 
h = plot(x,y);

pause(2);

%update y
y = rand(1,100);
set(h,'YData',y)
%update the plot.
drawnow

0
投票

我今天也有类似的问题。我正在使用您描述的策略来绘制一条线,但在将多条线绘制到同一个图上时它不起作用。我受到 Suever 的解决方案的启发,这与我所做的类似。

我试图对 3x3 子图执行此操作,但我认为这个想法应该概括。

首先,我使用ight_subplot 函数(从MATHWORKS 下载)创建了一个轴对象。我通过创建一个轴对象解决了这个问题

temp_axes = tight_subplot(numSubplotRows, numSubplotColumns);
for a = 1:(numSubplotColumns*numSubplotRows)
    fig_axes{a} = temp_axes(a);
end

然后第一次绘制到绘图时,我区分了使用嵌套单元格变量绘制到同一绘图的两个对象。第一个单元格指的是特定的子图,第二个单元格指的是绘制到图中的不同对象。

plts{currentplot}{1} = plot(fig_axes{currentplot}, data_1_x, data_1_y);
plts{currentplot}{2} = plot(fig_axes{currentplot}, data_1_y, data_2_y, 'r.');

更新绘图时,我调用 set,并引用 plts 组件

set(plts{currentplot}{1}, 'XData', data_1_x, 'YData', data_1_y);
set(plts{currentplot}{2}, 'XData', data_2_x, 'YData', data_2_y);

我简化了此代码片段,因此如果它不明显或不起作用,我很乐意更新。

© www.soinside.com 2019 - 2024. All rights reserved.