HOWTO · MATLAB
如何在 MATLAB 中创建动画图
学习如何使用 drawnow 命令和 pause 函数在 MATLAB 中创建动画图。本指南提供分步方法、实用示例以及动态可视化数据的技巧。借助 MATLAB 中的动画图,提升您的数据呈现效果并吸引观众。
本页内容
在循环中使用 drawnow,可以随着数据的变化刷新 MATLAB 图形。当您需要可见的延迟时,添加 pause();它接受以秒为单位的参数,但不能替代图形更新。这些示例使用与 MATLAB 通用的 Octave 兼容语法,供您参考改编;其中不包含这些示例的执行结果。
使用 drawnow 为 MATLAB 图形添加动画
此示例从左到右逐渐显示一条正弦曲线。循环在每次迭代中扩展所绘制的数据,axis 保持视图固定,drawnow 指示 MATLAB 渲染更新。蓝色的线条和标签使不断变化的数据一目了然。代码显示的图形标题和坐标轴标签保持英文,因为代码及其输出未经更改地保留了下来。
运行此示例:
x = 0:0.1:10;
y = sin(x);
warning('off', 'Octave:gnuplot-graphics');
figure;
plot(x(1), y(1), 'b-');
axis([0 10 -1 1]);
title('Animating a Sine Wave');
xlabel('X');
ylabel('sin(X)');
for k = 2:length(x)
plot(x(1:k), y(1:k), 'b-');
axis([0 10 -1 1]);
title('Animating a Sine Wave');
xlabel('X');
ylabel('sin(X)');
drawnow;
pause(0.02);
end
fprintf(1, 'Animation complete.\n');
第一个点在循环之前创建图形。之后的每次迭代都会绘制到当前点为止的曲线。请同时修改 x 的范围和 axis 中对应的水平限制;当数据超出当前范围时,修改垂直限制。MATLAB 的 plot 选项可让您调整线条颜色、标记和线宽。
使用 pause 控制动画时序
drawnow 更新所显示的图形;pause(seconds) 则延迟循环。例如,pause(0.05) 要求每次迭代等待 0.05 秒。较短的延迟会使动画看起来更快,较长的延迟会使其看起来更慢,但实际节奏还取决于计算和渲染,因此该值并不能保证帧率。若要在没有刻意延迟的情况下显示每次更新,请省略 pause() 并保留 drawnow。
在一个图形中为多个数据系列添加动画
每条线只创建一次,然后在循环中更新其数据。这样两个系列都保留在同一个坐标轴中,并且无需在每次迭代时重新创建图例。图例标签可以区分正弦曲线和余弦曲线。
x = 0:0.1:10;
warning('off', 'Octave:gnuplot-graphics');
figure;
hold on;
sine_line = plot(x(1), sin(x(1)), 'b-', 'LineWidth', 2);
cosine_line = plot(x(1), cos(x(1)), 'r-', 'LineWidth', 2);
axis([0 10 -1 1]);
title('Sine and Cosine');
xlabel('X');
ylabel('Value');
legend('Sine', 'Cosine');
for k = 2:length(x)
set(sine_line, 'XData', x(1:k), 'YData', sin(x(1:k)));
set(cosine_line, 'XData', x(1:k), 'YData', cos(x(1:k)));
drawnow;
pause(0.02);
end
hold off;
fprintf(1, 'Animation complete with two series.\n');
对于您自己的数据,请将两个表达式替换为相互匹配的数值数组,并将两条线都更新到相同的当前索引。保持不同的颜色或线条样式,并保留图例,以便识别各个系列。
保存或扩展动画
在 MATLAB 中,VideoWriter 可以将动画的帧保存为视频。为输出文件打开一个写入器,使用 getframe 捕获每个渲染的帧,将其传递给 writeVideo,并在循环结束时关闭写入器。请根据您的 MATLAB 安装情况调整所捕获的图形和输出设置;视频写入取决于 MATLAB 和所选的视频配置文件,上述示例并未演示此工作流程。
若要为另一个二维图形添加动画,请在同一个循环中更新其数据并调用 drawnow。当您希望视图稳定时,保持坐标轴限制固定;当希望由不断变化的数据决定视图时,重新计算坐标轴限制。对于三维线条,请使用 plot3 并同时更新 x、y 和 z 数据。
FAQ
如何控制动画速度?
调整或删除传递给 pause() 的延迟。它以秒为单位,感知到的节奏还取决于计算和渲染时间。
可以将动画图保存为视频吗?
可以。MATLAB 的 VideoWriter 工作流程可捕获帧并将其写入视频文件;有关步骤和改编注意事项,请参阅保存或扩展动画。
可以制作三维动画图吗?
可以。使用 plot3 并在循环中更新所有三个坐标数组,然后调用 drawnow 刷新图形。
可以为其他类型的图形添加动画吗?
可以。更新散点图、条形图或其他受支持图形的数据或图形对象,并在更新后调用 drawnow。要更改的对象属性取决于图形类型。
drawnow 和 pause() 有什么区别?
drawnow 刷新图形,使更改显示在图形中。pause() 等待以秒为单位的一段时间。当您需要带刻意延迟的可见更新时,请同时使用两者。