MATLAB中的连续绘图
我的代码中有一个循环,我想画一些变量 在每次迭代中,我绘制一个新点,我希望它连接到上一个点 下面是一个示例代码(在这段代码中循环是不必要的,但在实际代码中不是) 对的就是我想要的 我曾想过使用MATLAB中的连续绘图,matlab,plot,2d,line,Matlab,Plot,2d,Line,我的代码中有一个循环,我想画一些变量 在每次迭代中,我绘制一个新点,我希望它连接到上一个点 下面是一个示例代码(在这段代码中循环是不必要的,但在实际代码中不是) 对的就是我想要的 我曾想过使用行,但那会变得混乱(我必须更改I,并在每个行命令中使用4个点) 我似乎不是一个简单的问题,也许我遗漏了什么 谢谢你的帮助 我会用这一行替换您现有的绘图行 plot(t(1:i),s(1:i)); hold on; 这将绘制从索引1到当前索引的所有点。然后,通过删除“bo”,它将使用默认格式打印,这是您想
行
,但那会变得混乱(我必须更改I
,并在每个行
命令中使用4个点)
我似乎不是一个简单的问题,也许我遗漏了什么
谢谢你的帮助 我会用这一行替换您现有的绘图
行
plot(t(1:i),s(1:i)); hold on;
这将绘制从索引1到当前索引的所有点。然后,通过删除“bo”
,它将使用默认格式打印,这是您想要的线条
最后,如果您希望在屏幕上实际设置动画(如电影),则需要在循环结束之前添加drawnow
命令。您可能还希望在绘制后添加一个暂停(0.25)
,以插入四分之一秒的延迟,以便您的眼睛有机会在新绘制的图像被下一幅图像覆盖之前看到它。您可以使用打印句柄,然后相应地更新属性“扩展数据”和“YData”。因此,可以在循环之前打印第一个点并生成打印句柄。之后,绘图手柄可用,可以在循环内调整绘图
n = 500;
Fs = 1000;
f1 = 10;
t = (0 : n - 1) / Fs;
s = zeros(size(t));
s(1) = sin(2 * pi * f1 * t(1));
figure
handle = plot(s(1), t(1), 'bo-'); %// the plot handle
for i = 2 : n
s(i) = sin(2 * pi * f1 * t(i));
set(handle, 'XData', t(1:i), 'YData', s(1:i)) %// update the plot data
axis([0 t(end) -1 1]);
pause(0.1) %// small pause to see animation
end
这与@Nras的答案类似,但速度更快,更容易阅读。我有几个程序可以做这类事情,根据计算循环的长度,图形更新实际上可能是一个重要而恼人的瓶颈 如果您知道向量的最终长度,可以预先分配绘图,然后使用以下命令进行更新: MATLAB在计算限制时忽略“nan”,因此使用
nan
进行预分配使得调用xlim
变得不必要。另外,当我运行此操作时,暂停
是不必要的。您的里程可能会有所不同。我个人更喜欢这样做:
h = plot(t,emptyvec);
只要t
是已知的,并且不会太长,这不仅让我了解了计算过程,还让我了解了一种进度条。如果它非常长,我可能会分块填充t
,或者使用XData
和YData
作为循环缓冲区,使用ii=mod(I,100)代码>作为索引(例如),将产生示波器类型的效果。此外,不断重新计算轴限制也会造成时间损失
如果您不知道向量将有多长(例如,如果它在while
循环中),您可以使用您知道将更长的向量预分配、分块分配,或者只执行循环缓冲区操作
对于多个绘图,对每一条额外的线预先分配行
功能。与绘图
不同,您可以直接将更原始的行
函数包装到句柄
函数中
请注意,如果您使用的是MATLAB 2014b或更高版本(我不是),那么新的HG2图形系统使用对象作为句柄,而不是双倍,因此将数字句柄转换为对象句柄的handle
命令是多余的,可以直接使用点表示法。还要注意的是,这种方式使用的handle
是你能用它来代替这个循环吗?@excaza,没有我的s
和t
是1x1
并且是在循环中计算的,我不想保存以前的值。“XData”和“Ydata”在Matlab中的使用效率更高,这意味着您将获得比我提出的方法快得多的动画。但是,惩罚是代码读起来有点复杂。如果你想要额外的性能,那就要付一点罚金。谢谢你的回答,但是我没有访问以前的s
和t
的权限。让我来编辑这个问题+1感谢您的回答,但我无法访问以前的t
和s
值。我编辑了这个问题,请看你有什么想法。很抱歉再次打扰你。如果我在每次迭代中有2个绘图点,我该怎么做?我可以使用同一个手柄吗?不可以,但是添加多个绘图很容易。请参阅我的编辑。请注意,如果您使用的是MATLAB 2014b或更高版本(我不是),那么新的HG2图形系统将对象用作句柄,而不是双重句柄,因此将数字句柄转换为对象句柄的handle
命令是多余的。还请注意,以这种方式使用的handle
是未记录的。
n = 500;
Fs = 1000;
f1 = 10;
t = 0;
dt = 1 / Fs;
s = nan(1,n);
emptyvec = nan(1,n);
h1 = plot(emptyvec,emptyvec,'-bo');
h2 = handle(line(emptyvec,emptyvec,'Color','r','Marker','x','LineStyle','--'));
h1 = handle(h1);
for i = 1 : n
t = t + dt;
s = sin(2 * pi * f1 * t);
h1.XData(i) = t;
h1.YData(i) = s;
h2.XData(i) = t;
h2.YData(i) = s^2;
drawnow
end
h = plot(t,emptyvec);