有的時(shí)候践盼,gif 有助于對(duì)問(wèn)題的理解思瘟,下面就介紹一下如何利用Matlab來(lái)繪制gif圖。主要是源代碼及結(jié)果展示囚似,代碼里面有注釋?zhuān)鶕?jù)自己的需求剩拢,進(jìn)行修改即可。
注:
- 以下程序均需另存為 m 文件運(yùn)行饶唤,運(yùn)行后在Matlab的當(dāng)前路徑下徐伐,可以看到相應(yīng)的 gif 文件。
- 有的 gif 圖片是由多個(gè) gif 圖片拼接而成的募狂,拼接時(shí)所用的軟件是 ulead gif animator办素, 可自行搜索下載。
- 所測(cè)試的 Matlab版本是 R2016b祸穷,太低的版本可能沒(méi)法運(yùn)行
參考內(nèi)容:
MATLAB getframe用法
matlab制作GIF之hello world
1. 表現(xiàn)繪圖過(guò)程性穿,即圖形的增長(zhǎng)過(guò)程
%適用于在一幅圖中表現(xiàn)給圖過(guò)程,即圖形的增長(zhǎng)過(guò)程
%主要用來(lái)繪制三維的歐拉公式
clc;clear;clf;close all;
%獲得數(shù)據(jù)
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);
%確定首幅圖的樣式雷滚,并指定標(biāo)題需曾,坐標(biāo)軸標(biāo)題等樣式
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('實(shí)軸');
ylabel('時(shí)間軸');
zlabel('虛軸');
grid on;
set(gcf,'Position',[0,0,600,600], 'color','w');
set(gca,'ydir','reverse') %反轉(zhuǎn)坐標(biāo)軸
%確保圖像在采集的過(guò)程中包括坐標(biāo)軸及標(biāo)題
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)];
%在指定的范圍內(nèi)獲得圖像文件
frame = getframe(ax,rect);
im=frame2im(frame);
%創(chuàng)建gif文件,指定其樣式揭措,寫(xiě)入首幀圖像
k = 1;
%用胞元存儲(chǔ)采集到的圖像胯舷,方便后面反轉(zhuǎn)圖像用
[I{k},map{k}]=rgb2ind(im,256);
imwrite(I{k},map{k,1},'mygif.gif','gif','Loopcount',Inf,'DelayTime',0.2);
k = k + 1;
%畫(huà)圖并采集到gif中
steptmp = 20; %每幅圖要畫(huà)的點(diǎn)數(shù)
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的主要代碼,除了調(diào)節(jié)間隔時(shí)間外绊含,一般不需要改動(dòng)
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);
%寫(xiě)入模式為“追加”模式
imwrite(I{k},map{k},'mygif.gif','gif','WriteMode','append','DelayTime',0.1);
k = k + 1;
i = i + steptmp;
end
%將圖像按相反的順序再寫(xiě)入到gif中
for i = (k-1):-1:1
imwrite(I{i},map{i},'mygif.gif','gif','WriteMode','append','DelayTime',0.1);
end
結(jié)果圖:
圖1
2. 表示一個(gè)參數(shù)對(duì)圖形的影響
代碼如下:
function second_order_system_gif_1()
%此種情況用來(lái)表示某個(gè)參數(shù)變化時(shí)桑嘶,對(duì)相關(guān)圖形的影響
%此函數(shù)用來(lái)表示當(dāng)二階系統(tǒng)的共軛極點(diǎn)的虛部變化時(shí)對(duì)系統(tǒng)的
%頻率響應(yīng)和階躍響應(yīng)的影響
%后期可以通過(guò)Ulead GIF Animator軟件將這4張gif合并在一起
%問(wèn)題:圖像大小設(shè)置為某些值時(shí),可能會(huì)出錯(cuò)躬充,需要重新調(diào)整
clc;clear;close all;
%初始化數(shù)據(jù)
b = 2;
a = 0:0.5:20;
[~,size_a] = size(a);
num = b.^2 + a.^2;
for i = 1:size_a
den{i} = conv([1 b + a(i) * 1i],[1 b - a(i) * 1i]);
end
w = 0:0.01:30;
k = 1;
%有多幅圖逃顶,用胞元數(shù)組來(lái)指定文件名,從而方便在循環(huán)中使用
fieldnames = {'1.gif','2.gif','3.gif','4.gif'};
%畫(huà)圖充甚,并制作gif
%由于每次畫(huà)圖都要擦掉上一次畫(huà)的圖以政,所以圖形不能一直用hold on
for i = 1:1:size_a
%完成圖像的繪制,為了保證效果伴找,要保證圖像大小以及
%坐標(biāo)軸的范圍不變
figure(1);
set(gcf,'Position',[0,0,300,400], 'color','w');
[hz,hp,ht] = zplane(num(i),den{i});
hold on;
x_data = [0 hp.XData 0];
y_data = [0 hp.YData 0];
plot(x_data,y_data,'--');
ylim([-22,22]);
xlim([-6,6]);
title(['二階系統(tǒng)的極點(diǎn)',char(10,13)',...
'Created by Lijunjie']);
set(gca,'XTick',[-6:2:6]);
hold off
%采集繪制頻率響應(yīng)的數(shù)據(jù)
h = freqs(num(i), den{i},w);
mag = abs(h);
phase = angle(h);
phasedeg = phase*180/pi;
figure(2)
picture_positon;
plot(w,mag);
grid on;
xlabel 'Frequency (rad/s)', ylabel Magnitude
ylim([0 5.5]);
xlim([0 30]);
title(['二階系統(tǒng)的幅頻特性',char(10,13)',...
'Created by Lijunjie']);
figure(3);
picture_positon;
plot(w,phasedeg);
xlabel 'Frequency (rad/s)', ylabel 'Phase (degrees)';
ylim([-200,0]);
xlim([0 30]);
title(['二階系統(tǒng)的相頻特性',char(10,13)',...
'Created by Lijunjie']);
sys = tf(num(i),den{i});
figure(4)
[y_tmp,t_tmp] = step(sys,3.5);
plot(t_tmp,y_tmp);
picture_positon;
title(['二階系統(tǒng)的階躍響應(yīng)',char(10,13)',...
'Created by Lijunjie']);
xlabel('Time(seconds)');
ylabel('Amplitude');
axis([0 3.5 0 2]);
%制作pdf
if i == 1
%采集到首幀盈蛮,需要設(shè)置gif的樣式,以及確定圖像的大小
for j = 1:4
figure(j)
frame = getframe(gcf); % 獲取整個(gè)窗口內(nèi)容的圖像
im=frame2im(frame);
[I{j,k},map{j,k}]=rgb2ind(im,256);
imwrite(I{j,k},map{j,k},fieldnames{j},'gif','Loopcount',Inf,'DelayTime',0.2);
end
else
for j = 1:4
figure(j)
frame = getframe(gcf);% 獲取整個(gè)窗口內(nèi)容的圖像
im=frame2im(frame);
[I{j,k},map{j,k}]=rgb2ind(im,256);
%追加模式
imwrite(I{j,k},map{j,k},fieldnames{j},'gif','WriteMode','append','DelayTime',0.1);
end
end
k = k + 1;
end
%將采集到的圖像以相反的順序?qū)懭? for i = (k-1):-1:1
for j = 1:4
imwrite(I{j,i},map{j,i},fieldnames{j},'gif','WriteMode','append','DelayTime',0.1);
end
end
function picture_positon
%設(shè)置圖像的大小
set(gcf,'Position',[0,0,600,400], 'color','w');
end
end
結(jié)果是四幅圖技矮,如下:
圖2
圖3
圖4
圖5
用ulead gif animator合并后的效果如下:
圖6