Matlab中使用plot函式動態畫圖方法總結
阿新 • • 發佈:2018-12-12
Matlab除了強大的矩陣運算,模擬分析外,繪圖功能也是相當的強大,靜態畫圖沒什麼問題,由於Matlab本身的多執行緒程式設計缺陷,想要動態的畫圖,並且能夠很好的在GUI中得到控制,還不是一件很容易的事情,下面總結幾種方法。一. AXIS 移動座標系 這種方法是最簡單的一種方法,適合於資料已經全部生成的場合,先畫圖,然後移動座標軸。例項程式碼如下:
- %%
- %先畫好,然後更改座標系
- %在命令列中 使用 Ctrl+C 結束
- t=0:0.1:100*pi;
- m=sin(t);
- plot(t,m);
- x=-2*pi;
- axis([x,x+4*pi,-2,2]);
- grid on
- while 1
- if x>max(t)
- break;
- end
- x=x+0.1;
- axis([x,x+4*pi,-2,2]); %移動座標系
- pause(0.1);
- end
二. Hold On 模式 此種方法比較原始,適合於即時資料,原理是先畫上一幀,接著保留原始影象,追加下一幀影象,此種方式比較繁瑣,涉及畫圖細節,並且沒有完整並連續的Line物件資料。 例如:
- %%
- % Hold On 法
- % 此種方法只能點,或者分段劃線
- hold off
- t=0;
- m=0;
- t1=[0 0.1]; %要構成序列
- m1=[sin(t1);cos(t1)];
- p = plot(t,m,'*',t1,m1(1,:),'-r',t1,m1(2,:),'-b','MarkerSize',5);
- x=-1.5*pi;
- axis([x x+2*pi -1.5 1.5]);
- grid on;
- for i=1:100
- hold on
- t=0.1*i; %下一個點
- m=t-floor(t);
- t1=t1+0.1; %下一段線(組)
- m1=[sin(t1);cos(t1)];
- p = plot(t,m,'*',t1,m1(1,:),'-r',t1,m1(2,:),'-b','MarkerSize',5);
- x=x+0.1;
- axis([x x+2*pi -1.5 1.5]);
- pause(0.01);
- end
三. Plot 背景擦除模式 這種模式比較適合畫動畫,效率比較高,重新整理閃爍小,適合即時資料,最終的Line結構資料完整。 瞭解此方法之前要搞清楚 Plot函式的原型是什麼: Plot函式,輸入為 X-Y (-X)座標元組、以及“屬性”-“值對,輸出為一個列向量(每條曲線歲對應的Line結構 Handle,每一行代表一個 線條的handles), 每一線條都有 XData,YData 向量。如果你畫了2條線,那麼會返回 2×1的向量。 重新畫圖不需要 重新書寫 Plot,只需要 重新整理影象即可,使用drawnow函式。 完整例項如下: 1. 畫一個點的動畫:
- %%
- %採用背景擦除的方法,動態的劃點,並且動態改變座標系
- % t,m 均為一行 ,並且不能為多行
- t=0;
- m=0;
- p = plot(t,m,'*',...
- 'EraseMode','background','MarkerSize',5);
- x=-1.5*pi;
- axis([x x+2*pi -1.5 1.5]);
- grid on;
- for i=1:1000
- t=0.1*i; %兩個變數均不追加
- m=sin(0.1*i);
- set(p,'XData',t,'YData',m)
- x=x+0.1;
- drawnow
- axis([x x+2*pi -1.5 1.5]);
- pause(0.1);
- end
2. 動態多條曲線(即時資料)
- %%
- %採用背景擦除的方法,動態的劃線,並且動態改變座標系
- % 多行劃線
- t=[0]
- m=[sin(t);cos(t)]
- p = plot(t,m,...
- 'EraseMode','background','MarkerSize',5);
- x=-1.5*pi;
- axis([x x+2*pi -1.5 1.5]);
- grid on;
- for i=1:1000
- t=[t 0.1*i]; %Matrix 1*(i+1)
- m=[m [sin(0.1*i);cos(0.1*i)]]; %Matrix 2*(i+1)
- set(p(1),'XData',t,'YData',m(1,:))
- set(p(2),'XData',t,'YData',m(2,:))
- drawnow
- x=x+0.1;
- axis([x x+2*pi -1.5 1.5]);
- pause(0.5);
- end
上面的這幾個畫圖方式的示例只是簡單的for迴圈,是單執行緒的,如果是涉及到GUI的程式設計,那麼請使用Timer來完成這件事情,Timer是我在Matlab中實現多執行緒唯一方法(沒有找到別的方法)。