此动画来源于https://zhuanlan.zhihu.com/p/86152912。
我们不得不承认一个事实:
千言万语比不过一个图表具有说服力 一个动态的图表可以代替多个图表
下面我们将从做一个简单的三角函数图形开始说起:这里假设您已具备做简单图像,看懂简单代码的能力。
clear allclcx = 0:0.01:5*pi;y = sin(x);z = cos(x);plot(x,y,'r-','linewidth',2)hold onplot(x,z,'b-','linewidth',2)legend('sin(x)','cos(x)')xlabel('x')ylabel('y/z')set(gca,'fontsize',18)axis([0 16 -1.1 1.1])
以上代码就实现了同一张图同时绘制正弦与余弦的函数图像。那么接下来就要让我们的图像动起来。看一下效果吧!
clear allclc;clfx = 0:0.05:5*pi;y = sin(x);z = cos(x);subplot(211)plot(x,y,'r-','linewidth',2)hold onplot(x,z,'b-','linewidth',2)legend('sin(x)','cos(x)')xlabel('x')ylabel('y/z')set(gca,'fontsize',18)axis([0 16 -1.1 1.1])subplot(212)for ii = 1:length(x) plot(x(1:ii),y(1:ii),'r-o','linewidth',2) hold on plot(x(1:ii),z(1:ii),'b-^','linewidth',2) legend('sin(x)','cos(x)') xlabel('x') ylabel('y/z') set(gca,'fontsize',18) axis([0 16 -1.1 1.1]) xlabel('x') ylabel('y/z') set(gca,'fontsize',18) axis([0 16 -1.1 1.1]) % pause(0.001) drawnowend
那么怎么保存为视频或者gif格式呢?
准备工作:
1 getframe函数
% getframe函数
F = getframe
F = getframe(ax)
F = getframe(fig)
F = getframe(___,rect)
2 VideoWriter函数
v = VideoWriter(filename)
v = VideoWriter(filename,profile)
v = VideoWriter('peaks.avi');
open(v);
frame = getframe(gcf);
writeVideo(v,frame);
close(v);
3 pause函数
pause
pause(n)
pause(state)
oldState = pause(state)
4. Imwrite函数
imind = frame2im(MOV);
[imind,cm] = rgb2ind(imind,32);
if nn==100
imwrite(imind,cm,'gif2.gif','gif','LoopCount',Inf,'DelayTime',0.001);
else
imwrite(imind,cm,'gif2.gif','gif','WriteMode','append','DelayTime',0.001);
end
%writeVideo(aviobj,MOV);
pause(0.0001)
看一下完整的代码吧!
clear allclc;clfx = 0:0.05:5*pi;y = sin(x);z = cos(x);subplot(211)plot(x,y,'r-','linewidth',2)hold onplot(x,z,'b-','linewidth',2)legend('sin(x)','cos(x)')xlabel('x')ylabel('y/z')set(gca,'fontsize',18)axis([0 16 -1.1 1.1])subplot(212)% for ii = 1:length(x)% plot(x(1:ii),y(1:ii),'r-o','linewidth',2)% hold on% plot(x(1:ii),z(1:ii),'b-^','linewidth',2)% % legend('sin(x)','cos(x)')% xlabel('x')% ylabel('y/z')% set(gca,'fontsize',18)% axis([0 16 -1.1 1.1])% xlabel('x')% ylabel('y/z')% set(gca,'fontsize',18)% axis([0 16 -1.1 1.1])% % pause(0.001)% drawnow% endfilename='donghua1.mp4'v = VideoWriter(filename);open(v);for ii = 1:length(x) plot(x(1:ii),y(1:ii),'r-o','linewidth',2) hold on plot(x(1:ii),z(1:ii),'b-^','linewidth',2) legend('sin(x)','cos(x)') xlabel('x') ylabel('y/z') set(gca,'fontsize',18) axis([0 16 -1.1 1.1]) xlabel('x') ylabel('y/z') set(gca,'fontsize',18) axis([0 16 -1.1 1.1]) frame = getframe(gcf); writeVideo(v,frame); drawnowendclose(v);
那么如何保存gif格式呢
clear allclc;clfx = 0:0.2:5*pi;y = sin(x);z = cos(x);subplot(211)plot(x,y,'r-','linewidth',2)hold onplot(x,z,'b-','linewidth',2)legend('sin(x)','cos(x)')xlabel('x')ylabel('y/z')set(gca,'fontsize',18)axis([0 16 -1.1 1.1])subplot(212)% for ii = 1:length(x)% plot(x(1:ii),y(1:ii),'r-o','linewidth',2)% hold on% plot(x(1:ii),z(1:ii),'b-^','linewidth',2)%% legend('sin(x)','cos(x)')% xlabel('x')% ylabel('y/z')% set(gca,'fontsize',18)% axis([0 16 -1.1 1.1])% xlabel('x')% ylabel('y/z')% set(gca,'fontsize',18)% axis([0 16 -1.1 1.1])% % pause(0.001)% drawnow% end% filename='donghua1.mp4'% v = VideoWriter(filename);% open(v);% for ii = 1:length(x)% plot(x(1:ii),y(1:ii),'r-o','linewidth',2)% hold on% plot(x(1:ii),z(1:ii),'b-^','linewidth',2)% % legend('sin(x)','cos(x)')% xlabel('x')% ylabel('y/z')% set(gca,'fontsize',18)% axis([0 16 -1.1 1.1])% xlabel('x')% ylabel('y/z')% set(gca,'fontsize',18)% axis([0 16 -1.1 1.1])% frame = getframe(gcf);% writeVideo(v,frame);% drawnow% end% close(v);% filename='donghua1.mp4'% v = VideoWriter(filename);% open(v);for ii = 1:length(x) plot(x(1:ii),y(1:ii),'r-o','linewidth',2) hold on plot(x(1:ii),z(1:ii),'b-^','linewidth',2) legend('sin(x)','cos(x)') xlabel('x') ylabel('y/z') set(gca,'fontsize',18) axis([0 16 -1.1 1.1]) xlabel('x') ylabel('y/z') set(gca,'fontsize',18) axis([0 16 -1.1 1.1]) frame = getframe(gcf); imind = frame2im(frame); [imind,cm] = rgb2ind(imind,32); if ii==1 imwrite(imind,cm,'gif2.gif','gif','LoopCount',Inf,'DelayTime',0.001); else imwrite(imind,cm,'gif2.gif','gif','WriteMode','append','DelayTime',0.001); end pause(0.0001)end% close(v);