平臺:Win7 64 bit,Matlab R2014a(8.3)html
Matlab繪圖功能強大,本文以「圖解Matlab繪圖」的形式介紹Matlab繪圖的經常使用元素。程序員
1.以圖識圖編程
在Matlab中新建一個矩陣,在左側工做區窗口中選中這個變量,點擊菜單「繪圖」,便可以查看Matlab的各類圖形:數組
點擊「顯示更多」小箭頭:函數
點擊左下角「目錄」按鈕:工具
從這裏能夠看到全部Matlab的圖形。另外,從Matlab R2014a幫助文檔的「Types of MATLAB Plots」(搜索便可)中也能夠看到Matlab支持的全部圖形。個人另外一篇博文也總結了Matlab的全部繪圖函數——Matlab繪圖函數一覽。學習
這裏想說的是,數據可視化的目的原本就是讓人易於理解數據,學習Matlab繪圖也是這樣,應該以一種直觀的、圖形的、易於理解的方式進行(本文努力作到這點)。其實,若是隻是要用Matlab繪圖,並不是要系統掌握Matlab繪圖相關語法,只須要了解各個繪圖函數的輸入數據格式,其餘的如座標軸控制、註解、顏色圖等均可以經過在窗口中進行圖形界面上的操做進行,畢竟,沒有必要把時間浪費在記憶大量的語法上。ui
2.輸入數據格式spa
Matlab面向數學處理,輸入數據格式也是數學風格的,好比對於平面上的點集(點數組),Matlab用兩個一維數組來表示:x,y,這樣第i個點的座標就是(x(i),y(i))。這對於程序員來講可能有些不適應,由於面向對象程序設計思想要求封裝性,也就是要將一個點的x,y座標放在一塊兒構成Class「點」,而後用「點」這個類型來聲明數組。因此在使用Matlab繪圖功能時最好儘可能用數學的思惟方式,而不是編程思惟。設計
要查看繪圖函數的調用格式,請用「help xxx」指令,下面是一個例子:
在說具體數據格式以前,先要說一下「採樣」和「插值」。這裏說的Matlab繪圖,不少是要繪製連續函數的圖像,計算機存儲空間有限,連續(無限)的定義域要被「採樣」或者說「離散化」以後才能處理,而在繪製時,爲了顯示連續的的曲線或曲面,而不是僅僅繪製一系列點,須要進行「插值」,最多見的插值就是線性插值。其實,「採樣」和「插值」的概念在計算機科學中有普遍的存在。
下面以最多見的幾個繪圖函數爲例,介紹Matlab繪圖函數的輸入數據格式:
Function |
Syntax |
描述 |
plot |
plot(X,Y) plot(X,Y,LineSpec) plot(X1,Y1,...,Xn,Yn) plot(X1,Y1,LineSpec1,...,Xn,Yn,LineSpecn) plot(Y) plot(Y,LineSpec) plot(___,Name,Value) plot(axes_handle,___) h = plot(___) |
若X,Y均爲向量,則點(X(i),Y(i))做爲第i個被繪製的點,根據格式控制的不一樣,相鄰點間可能被插值(連一條直線段); 若X,Y爲尺寸相同的矩陣,X(:,i),Y(:,i)被繪製爲一條曲線,默認不一樣曲線將有不一樣顏色; 若X被省略,則至關於X=1:n,n爲點數。 |
bar |
bar(Y) bar(x,Y) bar(___,width) bar(___,style) bar(___,bar_color) bar(___,Name,Value) bar(axes_handle,___) h = bar(___) |
在x(i)處繪製一組(grouped)或一條堆疊(stacked)的條形,條形高度由Y(i,:)指定; 若x被省略,則至關於x=1:n,n爲Y的行數。 |
scatter |
scatter(X,Y) scatter(X,Y,S) scatter(X,Y,S,C) scatter(___,'fill') scatter(___,markertype) scatter(___,Name,Value) scatter(axes_handle,___) h = scatter(___) |
對每一個點(X(i),Y(i)),繪製一個圓圈; 若S是向量,圓圈大小由S(i)指定,若S是標量,由S指定; 若C是向量,圓圈的顏色由C(i)對應的顏色組成,若C是矩陣,由C(i,1:3)指定RGB顏色值。 |
contour |
contour(X,Y,Z) contour(Z) contour(…,n) contour(…,v) contour(...,LineSpec) contour(axes_handle,...) [C,h] = contour(...) |
Z爲MxN的二維數組,若X,Y也是MxN二維數組,則Z(i,j)=F(X(i,j),Y(i,j)),若X,Y是向量,則Z(i,j)=F(X(j),Y(i))(即把X,Y看作列向量),F爲二維函數; 若X,Y被省略,則至關於X=1:N,Y=1:M; 標量n設定等值線條數; 單調遞增向量v設定等值線的值。
|
surf |
surf(X,Y,Z) surf(Z) surf(…,C) surf(...,'PropertyName',PropertyValue) surf(axes_handles,...) h = surf(...) |
Z爲MxN的二維數組,若X,Y也是MxN二維數組,則Z(i,j)=F(X(i,j),Y(i,j)),若X,Y是向量,則Z(i,j)=F(X(j),Y(i))(即把X,Y看作列向量),F爲二維函數; 若X,Y被省略,則至關於X=1:N,Y=1:M; C(i,j)的值對應到曲面上i,j點的顏色。 |
mesh |
mesh(X,Y,Z) mesh(Z) mesh(...,C) mesh(...,'PropertyName',PropertyValue,...) mesh(axes_handles,...) h = mesh(...) |
X,Y,Z,C的含義同surf。 注:對於向量x,y,能夠用「[X,Y]=meshgrid(x,y)」構造二維數組X,Y,使得mesh(x,y,Z)和mesh(X,Y,Z)等價,也即有MxN個採樣點,(X(i,j),Y(i,j))是索引爲i,j的格點的x,y座標。 |
slice |
slice(V,sx,sy,sz) slice(X,Y,Z,V,sx,sy,sz) slice(V,XI,YI,ZI) slice(X,Y,Z,V,XI,YI,ZI) slice(...,'method') slice(axes_handle,...) h = slice(...) |
V爲MxNxP的三維數組,若X,Y也是MxNxPs三維數組,則V(i,j,k)=F(X(i,j,k,Y(i,j,k),Z(i,j,k)),若X,Y,Z是向量,則V(i,j,k)=F(X(j),Y(i),Z(k)) ,F爲三維函數; 若X,Y,Z被省略,則至關於X=1:N,Y=1:M,Z=1:P; 向量sx,sy,sz指定垂直於x,y,z軸的切片位置; 矩陣XI,YI,ZI定義更復雜的切片(可能不是平面)。 |
coneplot |
coneplot(X,Y,Z,U,V,W,Cx,Cy,Cz) coneplot(U,V,W,Cx,Cy,Cz) coneplot(...,s) coneplot(...,color) coneplot(...,'quiver') coneplot(...,'method') coneplot(X,Y,Z,U,V,W,'nointerp') coneplot(axes_handle,...) h = coneplot(...) |
X,Y,Z,U,V,W都是MxNxP的三維數組,U(i,j,k)=Fu(X(i,j,k),Y(i,j,k),Z(i,j,k)),Fu爲三維向量函數F的x份量,相似定義Fv,Fw; 若X,Y,Z被省略,則至關於[X,Y,Z]=meshgrid(1:N,1:M,1:P); Cx,Cy,Cz定義圓錐起點的x,y,z座標; s定義縮放因子; color指定圓錐顏色; 'quiver'指定用箭頭代替圓錐; 'method'在Cx,Cy,Cz指定點上的插值方法。 |
3.格式控制及註解
前面也說了,若是僅是要繪圖,經過窗口操做這種「所見即所得」的方式不但能夠快速生成美觀的圖形,並且節省大量時間,下面就首先來看看在Matlab的圖形窗口如何進行圖形格式控制。下面是Matlab的圖形窗口:
Z=peaks;
surf(Z);
上圖中已經能夠對圖形進行縮放、平移、旋轉、拾取數據、刷亮、圖形連接、插入顏色欄、插入圖例等功能,經過在菜單中選擇還能夠添加光照、座標軸標籤等,點擊上圖中的紅色箭頭所指按鈕後將顯示更多繪圖工具欄:
能夠看到這已是一個很是強大的編輯界面了,點擊上圖右下角按鈕「更多屬性…」,將看到:
這裏能夠進行更爲全面的控制,很容易猜到,這裏的項和指令代碼有很好的對應。經過一番調整,且沒有寫任何代碼,個人圖已經變成以下樣子(峯值數據是經過拾取工具獲得的):
若是以爲格式調整的好,還能夠將全部的設置和調整「打包」成代碼,在圖形窗口中點擊菜單「文件 >> 生成代碼…」即生成一個M函數文件,之後調用這個函數對新數據進行繪圖時,全部設置便自動應用到新數據上,也能夠查看生成的代碼來學習繪圖相關語法。這種以「從圖形到代碼」的方式和傳統「從代碼到圖形」的方式相比效率定會高出不少。
Matlab繪圖格式控制的詳細說明參考Matlab幫助文檔「Matlab/Graphics/Formatting and Annotation」,下面僅對最爲經常使用的指令進行介紹:
座標系:
指令 |
說明 |
axis on/off |
打開/關閉座標軸顯示 |
Axis(V) V=[x1,x2,y1,y2]或[x1,x2,y1,y2,z1,z2] |
設定座標範圍 |
axis equal |
x,y座標採用等長刻度 |
axis vis3d |
三維旋轉觀察時保持高寬比不變,避免圖形大小變化 |
grid on/off |
打開/關閉分格線 |
xlabel(S)/ylabel(S)/zlabel(S) |
設定x/y/z軸標籤爲S |
註解:
指令 |
說明 |
title(S) |
設定圖的標題 |
legend(S1,S2,…) |
加入圖例 |
text(xt,yt,S) |
在(xt,yt)處書寫註釋S |
關於字符串顯示的格式及轉移符號參考Matlab幫助文檔「Text Properties」。
重疊繪圖:
指令「hold on/off」控制是重疊繪製仍是覆蓋已有圖形。
多子圖:
指令「subplot(m,n,p)」將繪圖區分爲mxn個區域,並指定以行優先的第p個子區爲當前繪製區,例以下(取自Matlab幫助文檔):
x = linspace(0,10); y1 = sin(x); y2 = sin(2*x); y3 = sin(4*x); y4 = sin(8*x); figure subplot(2,2,1); plot(x,y1); title('Subplot 1: sin(x)') subplot(2,2,2); plot(x,y2); title('Subplot 2: sin(2x)') subplot(2,2,3) plot(x,y3); title('Subplot 3: sin(4x)') subplot(2,2,4) plot(x,y4); title('Subplot 4: sin(8x)')
Colormap, Shading, Light:
爲了直觀呈現數據,花哨的顏色是少不了的,除了直接指定所繪製對象的顏色外,顏色能夠由標量數據映射到顏色表獲得,從而得以利用顏色來呈現第四維度的信息。這裏又涉及「採樣」和「插值」,一個Colormap定義一個顏色表,這是採樣後的有限個顏色值,待映射函數值f首先根據Cmax和Cmin算出一個1-N的數c,N是顏色表顏色值的個數,對c進行上下取整做爲索引獲得兩個顏色值,再根據c和這兩個顏色值插值獲得f映射的顏色,f映射的顏色只是一個格點的顏色,由四個格點圍成的小四邊形的顏色由這四個格點插值獲得,shading和light指令就是用來控制映射的顏色值如何影響顯示顏色的。
參考Matlab幫助文檔「Matlab/Graphics/Formatting and Annotation」。
參考文獻:
博客:Matlab繪圖函數一覽;
《MATLAB R2011a教程》(張志涌等,北京航空航天大學出版社,2011),第5章;
Matlab R2014a幫助文檔,「MATLAB/Graphics」(在線版本)。