具有多个数据的 Matlab 更新图 lines/curves
Matlab update plot with multiple data lines/curves
我想尽快更新包含多个数据的图表 lines/curves。我已经看到一些更新情节的方法,例如使用:
h = plot(x,y);
set(h,'YDataSource','y')
set(h,'XDataSource','x')
refreshdata(h,'caller');
或
set(h,'XData',x,'YData',y);
对于单条曲线,效果很好,但是我不仅要更新一条数据曲线,还要更新多条数据曲线。我该怎么做?
如果您使用单个 plot
命令创建多个绘图对象,则 plot
返回的句柄实际上是 an array of plot objects(每个绘图一个)。
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
.[=22= 之前它们实际上不会被渲染。 ]
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
方法,你实际上可以这样做,但是你需要为 [=32= 指定一个唯一的数据源]每个 绘图对象。
% 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)
您可以使用 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
我想尽快更新包含多个数据的图表 lines/curves。我已经看到一些更新情节的方法,例如使用:
h = plot(x,y);
set(h,'YDataSource','y')
set(h,'XDataSource','x')
refreshdata(h,'caller');
或
set(h,'XData',x,'YData',y);
对于单条曲线,效果很好,但是我不仅要更新一条数据曲线,还要更新多条数据曲线。我该怎么做?
如果您使用单个 plot
命令创建多个绘图对象,则 plot
返回的句柄实际上是 an array of plot objects(每个绘图一个)。
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
.[=22= 之前它们实际上不会被渲染。 ]
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
方法,你实际上可以这样做,但是你需要为 [=32= 指定一个唯一的数据源]每个 绘图对象。
% 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)
您可以使用 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