Matlab繪圖基礎

 

平臺: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」(在線版本)。

相關文章
相關標籤/搜索