在使用 matlab 或者 octave 时,有时会需要绘制动图(.gif)并保存,这里对动图(其他图片格式,同理)进行阐述。
有的时候,gif 有助于对问题的理解,下面就介绍一下如何利用Matlab来绘制gif图。主要是源代码及结果展示,代码里面有注释,根据自己的需求,进行修改即可。
一、 绘制 正弦函数(y = sin(x))的增长过程
clc, clear, close all;
f_num = 1; % 帧数索引
figure;
for k = 1 : 1 : 100 % 选取的动态参数
x = -pi : 0.1 : pi*k;
y = sin(x);
% 绘制正弦函数
axis([-pi 100*pi -1 1]);
plot(y);
title('y = sin(x)');
F = getframe(gcf); % 截取帧
I = frame2im(F); % 从单个影片帧F返回真色彩(RGB)图像
[I, map] = rgb2ind(I); % 使用具有256种量化银色的最小方差量化法并加入抖动,将RGB图像转换成索引图像I,关联颜色图为map。
if f_num == 1 % 如果不存在该图片,则创建
imwrite(I, map, 'sinFunc.gif', 'gif', 'Loopcount', inf, 'DelayTime', 0.3);
else % 如果已经存在该gif图,则写入数据(此时使用 append 追加模式)
imwrite(I, map, 'sinFunc.gif', 'gif', 'WriteMode', 'append', 'DelayTime', 0.3);
end
f_num = f_num + 1; % 索引帧数+1
end
结果:
二 表现绘图过程,即图形的增长过程
参考内容:
Matlab绘制动态 .gif 图
注:
以下程序均需另存为 m 文件运行,运行后在Matlab的当前路径下,可以看到相应的 gif 文件。
有的 gif 图片是由多个 gif 图片拼接而成的,拼接时所用的软件是 ulead gif animator, 可自行搜索下载。
所测试的 Matlab版本是 R2016b,太低的版本可能没法运行
%适用于在一幅图中表现给图过程,即图形的增长过程
%主要用来绘制三维的欧拉公式
clc;clear;clf;close all;
%获得数据
tmax = 4*pi;
t = 0:0.01:tmax;
tmp = exp(1i*t);
x = real(tmp);
y = imag(tmp);
[a,b] = size(x);
y1 = zeros(a,b) ;
x1 = zeros(a,b);
%确定首幅图的样式,并指定标题,坐标轴标题等样式
plot3(x(1,1),t(1,1),y(1,1),'black');
hold on
plot3(x(1,1),t(1,1),y1(1,1),'blue');
plot3(x1(1,1),t(1,1),y(1,1),'r');
axis([-1,1,0,tmax,-1,1])
str = ['$${e^{it}} = \cos t + i\sin t $$',char(13,10)','created by Lijunjie!'];
title({str},'interpreter','latex')
xlabel('实轴');
ylabel('时间轴');
zlabel('虚轴');
grid on;
set(gcf,'Position',[0,0,600,600], 'color','w');
set(gca,'ydir','reverse') %反转坐标轴
%确保图像在采集的过程中包括坐标轴及标题
ax = gca;
ax.Units = 'pixels';
pos = ax.Position;
ti = ax.TightInset;
rect = [-ti(1), -ti(2), pos(3)+ti(1)+ti(3), pos(4)+ti(2)+ti(4)];
%在指定的范围内获得图像文件
frame = getframe(ax,rect);
im=frame2im(frame);
%创建gif文件,指定其样式,写入首帧图像
k = 1;
%用胞元存储采集到的图像,方便后面反转图像用
[I{k},map{k}]=rgb2ind(im,256);
imwrite(I{k},map{k,1},'mygif.gif','gif','Loopcount',Inf,'DelayTime',0.2);
k = k + 1;
%画图并采集到gif中
steptmp = 20; %每幅图要画的点数
i = steptmp;
while i < (b-1)
x_1 = x(1,(i-steptmp+1):i+1);
t_1 = t(1,(i-steptmp+1):i+1);
y_1 = y(1,(i-steptmp+1):i+1);
y1_1 = y1(1,(i-steptmp+1):i+1);
x1_1 = x1(1,(i-steptmp+1):i+1);
plot3(x_1,t_1,y_1,'black');
hold on
plot3(x_1,t_1,y1_1,'blue');
plot3(x1_1,t_1,y_1,'r');
%下面是制作gif的主要代码,除了调节间隔时间外,一般不需要改动
ax = gca;
ax.Units = 'pixels';
pos = ax.Position;
ti = ax.TightInset;
rect = [-ti(1), -ti(2), pos(3)+ti(1)+ti(3), pos(4)+ti(2)+ti(4)];
frame = getframe(ax,rect);
im=frame2im(frame);
[I{k},map{k}]=rgb2ind(im,256);
%写入模式为“追加”模式
imwrite(I{k},map{k},'mygif.gif','gif','WriteMode','append','DelayTime',0.1);
k = k + 1;
i = i + steptmp;
end
%将图像按相反的顺序再写入到gif中
for i = (k-1):-1:1
imwrite(I{i},map{i},'mygif.gif','gif','WriteMode','append','DelayTime',0.1);
end