Matlab繪制動(dòng)態(tài) .gif 圖

有的時(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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末抖誉,一起剝皮案震驚了整個(gè)濱河市殊轴,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌袒炉,老刑警劉巖旁理,帶你破解...
    沈念sama閱讀 218,386評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異我磁,居然都是意外死亡孽文,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén)夺艰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)芋哭,“玉大人,你說(shuō)我怎么就攤上這事劲适】簦” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,704評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵霞势,是天一觀的道長(zhǎng)烹植。 經(jīng)常有香客問(wèn)我,道長(zhǎng)愕贡,這世上最難降的妖魔是什么草雕? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,702評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮固以,結(jié)果婚禮上墩虹,老公的妹妹穿的比我還像新娘。我一直安慰自己憨琳,他們只是感情好诫钓,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著篙螟,像睡著了一般菌湃。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上遍略,一...
    開(kāi)封第一講書(shū)人閱讀 51,573評(píng)論 1 305
  • 那天惧所,我揣著相機(jī)與錄音,去河邊找鬼绪杏。 笑死下愈,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蕾久。 我是一名探鬼主播势似,決...
    沈念sama閱讀 40,314評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了履因?” 一聲冷哼從身側(cè)響起辖佣,我...
    開(kāi)封第一講書(shū)人閱讀 39,230評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎搓逾,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體杯拐,經(jīng)...
    沈念sama閱讀 45,680評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡霞篡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評(píng)論 3 336
  • 正文 我和宋清朗相戀三年埃难,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了鉴扫。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片壮莹。...
    茶點(diǎn)故事閱讀 39,991評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡韩玩,死狀恐怖硝皂,靈堂內(nèi)的尸體忽然破棺而出铃诬,到底是詐尸還是另有隱情田篇,我是刑警寧澤禀崖,帶...
    沈念sama閱讀 35,706評(píng)論 5 346
  • 正文 年R本政府宣布礁鲁,位于F島的核電站盐欺,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏仅醇。R本人自食惡果不足惜冗美,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望析二。 院中可真熱鬧粉洼,春花似錦、人聲如沸叶摄。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,910評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)蛤吓。三九已至宵喂,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間柱衔,已是汗流浹背樊破。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,038評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留唆铐,地道東北人哲戚。 一個(gè)月前我還...
    沈念sama閱讀 48,158評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像艾岂,于是被迫代替她去往敵國(guó)和親顺少。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容