如何在Matlab中制作动画图表

16

我想知道有没有人知道如何制作x=(1000个点的数据集)和y=(1000个点的数据集)的动画图。

最大的问题是这些是我试图绘制的数据集,或者说是x、y坐标,而不是函数,如果是函数的话,我知道如何通过动画来绘制。

我尝试使用for循环中的帧,但它只给我点,而没有将它们连接成一条线形图,所以我无法观察轨迹的路径。

我使用的代码是:

for i = 1:length(DATASET1)
pause(0.1)
plot(DATASET1(i),DATASET2(i))
draw on
end

你尝试过哪些代码没有成功? - darthbith
这不是一个绘图命令... 你应该编辑帖子(在标签下方的链接)以包含你目前为止所有的代码。你可以通过点击“{}”按钮、按下“CTRL-K”或将其缩进4个空格来格式化代码。 - darthbith
非常抱歉没有做到那件事,非常感谢您。 - branny12000
由于某些原因,我无法在评论中以那种格式放置代码。如果我去回答问题,我就可以这样做,但我必须等待8个小时才能这样做...抱歉,我会尝试将其包含在我的问题中。 - branny12000
最好将其编辑到问题中,而不是在评论中发布 :-) 很好,你修复了你的问题。 - darthbith
3个回答

37

如果你想让图表逐渐“增长”:最简单的方法是创建一个空的图表,然后在每个迭代中更新其XDataYData属性:

h = plot(NaN,NaN); %// initiallize plot. Get a handle to graphic object
axis([min(DATASET1) max(DATASET1) min(DATASET2) max(DATASET2)]); %// freeze axes
%// to their final size, to prevent Matlab from rescaling them dynamically 
for ii = 1:length(DATASET1)
    pause(0.01)
    set(h, 'XData', DATASET1(1:ii), 'YData', DATASET2(1:ii));
    drawnow %// you can probably remove this line, as pause already calls drawnow
end

这是一个例子1,使用DATASET1 = 1:100; DATASET2 = sin((1:100)/6);得到。

enter image description here


1 如果有人感兴趣,该图是一个动态GIF,可以通过在循环之后添加以下代码(来自此处)并在drawnow行之后运行来创建:

  frame = getframe(1);
  im = frame2im(frame);
  [imind,cm] = rgb2ind(im,256);
  if ii == 1;
      imwrite(imind,cm,filename,'gif','Loopcount',inf);
  else
      imwrite(imind,cm,filename,'gif','WriteMode','append');
  end
抱歉,提供的内容无法翻译成清晰的意思。这是一个空的 HTML 标签,没有足够的上下文来理解其含义和目的。

@Divakar 是的。我使用了这个 - Luis Mendo
1
太酷了!只因你分享了这个动态图,我给你点赞。 - bla
@natan 谢谢!我通常讨厌动态图像,因为它们太分散注意力了...但我忍不住要用 :-) - Luis Mendo
@SanthanSalai 谢谢! - Luis Mendo

9

看起来你很接近了。但是不确定draw on是什么命令。

看看这里的代码是否能激发你解决问题的灵感 -

%// Sample x and y values assumed for demo.
x = 1:1000;
y = x.^2;

%// Plot starts here
figure,hold on

%// Set x and y limits of the plot
xlim([min(x(:)) max(x(:))])
ylim([min(y(:)) max(y(:))])

%// Plot point by point
for k = 1:numel(x)
    plot(x(k),y(k),'-') %// Choose your own marker here

    %// MATLAB pauses for 0.001 sec before moving on to execue the next 
    %%// instruction and thus creating animation effect
    pause(0.001);     
end

非常感谢您的帮助。由于某种原因,我的图表无法绘制,我修改了它,将x设置为DATASET1,将y设置为DATASET2。轴已经出现,但是上面没有任何内容被绘制。 - branny12000
最大的问题是我可以更新“点”,但无法形成折线图,以便我可以看到已创建的路径。 - branny12000
在循环结束后添加以下内容 - plot(x,y,'-') - Divakar
@branny12000,请告诉我代码是否有效。我会相应地更新我的解决方案。 - Divakar
也许最初的 "draw on" 本意是 drawnow。通常需要使用该函数来告诉 Matlab 刷新图形事件队列并强制绘制你的图像。在你的代码中,你不需要使用 drawnow,因为它会被 pause 隐式调用。 - Luis Mendo
显示剩余7条评论

5
自R2014b以来,您可以使用animatedline对象(dochow-to),该对象旨在很好地处理动画图形。基本上,animatedline对象具有一个addpoints函数,可以添加新的点到线条中而无需重新定义现有的点,还有一个clearpoints函数,用于更复杂的动画清除线条。
以下是一个示例:
h = animatedline;
axis([0,4*pi,-1,1])

x = linspace(0,4*pi,1000);
y = sin(x);
for k = 1:length(x)  
    addpoints(h,x(k),y(k));
    drawnow
end

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