1. 程式人生 > >Matlab中使用plot函式動態畫圖方法總結

Matlab中使用plot函式動態畫圖方法總結

原文

Matlab除了強大的矩陣運算,模擬分析外,繪圖功能也是相當的強大,靜態畫圖沒什麼問題,由於Matlab本身的多執行緒程式設計缺陷,想要動態的畫圖,並且能夠很好的在GUI中得到控制,還不是一件很容易的事情,下面總結幾種方法。一. AXIS 移動座標系     這種方法是最簡單的一種方法,適合於資料已經全部生成的場合,先畫圖,然後移動座標軸。例項程式碼如下:  

  1. %%
  2. %先畫好,然後更改座標系
  3. %在命令列中 使用 Ctrl+C 結束
  4. t=0:0.1:100*pi;
  5. m=sin(t);
  6. plot(t,m);
  7. x=-2*pi;
  8. axis([x,x+4*pi,-2,2]);
  9. grid on
  10. while 1
  11. if x>max(t)
  12. break;
  13. end
  14. x=x+0.1;
  15. axis([x,x+4*pi,-2,2]); %移動座標系
  16. pause(0.1);
  17. end

二. Hold On 模式              此種方法比較原始,適合於即時資料,原理是先畫上一幀,接著保留原始影象,追加下一幀影象,此種方式比較繁瑣,涉及畫圖細節,並且沒有完整並連續的Line物件資料。    例如:  

  1. %%
  2. % Hold On 法
  3. % 此種方法只能點,或者分段劃線
  4. hold off
  5. t=0;
  6. m=0;
  7. t1=[0 0.1]; %要構成序列
  8. m1=[sin(t1);cos(t1)];
  9. p = plot(t,m,'*',t1,m1(1,:),'-r',t1,m1(2,:),'-b','MarkerSize',5);   
  10. x=-1.5*pi;
  11. axis([x x+2*pi -1.5 1.5]);
  12. grid on;
  13. for i=1:100
  14.     hold on
  15.     t=0.1*i; %下一個點
  16.     m=t-floor(t);
  17.     t1=t1+0.1; %下一段線(組)
  18.     m1=[sin(t1);cos(t1)];
  19.     p = plot(t,m,'*',t1,m1(1,:),'-r',t1,m1(2,:),'-b','MarkerSize',5);   
  20.     x=x+0.1;
  21.     axis([x x+2*pi -1.5 1.5]);
  22.     pause(0.01);
  23. end

三. Plot 背景擦除模式       這種模式比較適合畫動畫,效率比較高,重新整理閃爍小,適合即時資料,最終的Line結構資料完整。       瞭解此方法之前要搞清楚 Plot函式的原型是什麼: Plot函式,輸入為 X-Y (-X)座標元組、以及“屬性”-“值對,輸出為一個列向量(每條曲線歲對應的Line結構 Handle,每一行代表一個 線條的handles), 每一線條都有 XData,YData 向量。如果你畫了2條線,那麼會返回 2×1的向量。 重新畫圖不需要 重新書寫 Plot,只需要 重新整理影象即可,使用drawnow函式。 完整例項如下: 1. 畫一個點的動畫:  

  1. %%
  2. %採用背景擦除的方法,動態的劃點,並且動態改變座標系
  3. % t,m 均為一行 ,並且不能為多行
  4. t=0;
  5. m=0;
  6. p = plot(t,m,'*',...
  7.    'EraseMode','background','MarkerSize',5);
  8. x=-1.5*pi;
  9. axis([x x+2*pi -1.5 1.5]);
  10. grid on;
  11. for i=1:1000
  12.     t=0.1*i;       %兩個變數均不追加
  13.     m=sin(0.1*i);
  14.     set(p,'XData',t,'YData',m)
  15.     x=x+0.1;   
  16.     drawnow
  17.     axis([x x+2*pi -1.5 1.5]);
  18.     pause(0.1);
  19. end

2. 動態多條曲線(即時資料)

  1. %%
  2. %採用背景擦除的方法,動態的劃線,並且動態改變座標系
  3. % 多行劃線
  4. t=[0]
  5. m=[sin(t);cos(t)]
  6. p = plot(t,m,...
  7.    'EraseMode','background','MarkerSize',5);
  8. x=-1.5*pi;
  9. axis([x x+2*pi -1.5 1.5]);
  10. grid on;
  11. for i=1:1000
  12.     t=[t 0.1*i];                   %Matrix 1*(i+1)
  13.     m=[m [sin(0.1*i);cos(0.1*i)]]; %Matrix 2*(i+1)
  14.     set(p(1),'XData',t,'YData',m(1,:))
  15.     set(p(2),'XData',t,'YData',m(2,:))   
  16.     drawnow
  17.     x=x+0.1;   
  18.     axis([x x+2*pi -1.5 1.5]);
  19.     pause(0.5);
  20. end

      上面的這幾個畫圖方式的示例只是簡單的for迴圈,是單執行緒的,如果是涉及到GUI的程式設計,那麼請使用Timer來完成這件事情,Timer是我在Matlab中實現多執行緒唯一方法(沒有找到別的方法)。