天天看點

MATLAB 的繪圖:二維和三維

本節介紹MATLAB 的兩種基本繪圖功能:二維平面圖形和三維立體圖形。

5.1 二維平面圖形

5.1.1 基本圖形函數

plot 是繪制二維圖形的最基本函數,它是針對向量或矩陣的列來繪制曲線的。也就是

說,使用plot 函數之前,必須首先定義好曲線上每一點的x 及y 坐标,常用格式為:

(1)plot(x) 當x 為一向量時,以x 元素的值為縱坐标,x 的序号為橫坐标值繪制

曲線。當x 為一實矩陣時,則以其序号為橫坐标,按列繪制每列元素值相對于其序号的曲

線,

當x 為m× n 矩陣時,就由n 條曲線。

(2)plot(x,y) 以x 元素為橫坐标值,y 元素為縱坐标值繪制曲線。

(3)plot(x,y1,x,y2,…) 以公共的x 元素為橫坐标值,以y1,y2,… 元素為縱坐标值繪

制多條曲線。

例5.1.1 畫出一條正弦曲線和一條餘弦曲線。

>> x=0:pi/10:2*pi;

>> y1=sin(x);

>> y2=cos(x);

>> plot(x,y1,x,y2)

圖5.1.1 函數plot 繪制的正弦曲線

在繪制曲線圖形時,常常采用多種顔色或線型來區分不同的資料組,MATLAB 軟體專

門提供了這方面的參數選項(見表5.1.1),我們隻要在每個坐标後加上相關字元串,就可

現它們的功能。

- 2 -

表5.1.1 繪圖參數表

色彩字元顔色線型字元線型格式标記符号資料點形式标記符号資料點形式

y 黃- 實線. 點< 小于号

m 紫: 點線o 圓s 正方形

c 青-. 點劃線x 叉号d 菱形

r 紅- - 虛線+ 加号h 六角星

g 綠* 星号p 五角星

b 藍v 向下三角形

w 白^ 向上三角形

k 黑> 大于号

例如,在上例中輸入

>> plot(x,y1,'r+-',x,y2,'k*:')

則得圖5.1.2

圖5.1.2 使用不同标記的plot 函數繪制的正弦曲線

5.1.2 圖形修飾

MATLAB 軟體為使用者提供了一些特殊的圖形函數,用于修飾已經繪制好的圖形。

表5.1.2 圖形修飾函數表

函數含義

grid on (/off) 給目前圖形标記添加(取消)網絡

xlable(‘string’) 标記橫坐标

ylabel(‘string’) 标記縱坐标

title(‘string’) 給圖形添加标題

text(x,y,’string’) 在圖形的任意位置增加說明性文本資訊

gtext(‘string’) 利用滑鼠添加說明性文本資訊

axis([xmin xmax ymin ymax]) 設定坐标軸的最小最大值

- 3 -

例5.1.2 給例5.1.1 的圖形中加入網絡和标記。(見圖5.1.3 和5.1.4)

>> x=0:pi/10:2*pi;

>> y1=sin(x);

>> y2=cos(x);

>> plot(x,y1,x,y2)

>> grid on

>> xlabel('independent variable X')

>> ylabel('Dependent Variable Y1 & Y2')

>> title('Sine and Cosine Curve')

>> text(1.5,0.3,'cos(x)')

>> gtext('sin(x)')

>> axis([0 2*pi -0.9 0.9])

圖5.1.3 使用了圖形修飾的plot 函數繪制的正弦曲線

5.1.3 圖形的比較顯示

在一般預設的情況下,MATLAB 每次使用plot 函數進行圖形繪制,将重新産生一個圖

形視窗。但有時希望後續的圖形能夠和前面所繪制的圖形進行比較。一般來說有兩種方法

一是采用hold on(/off)指令,将新産生的圖形曲線疊加到已有的圖形上;二是采用

subplot(m,n,k)函數,将圖形視窗分隔成n m× 個子圖,并選擇第k 個子圖作為目前圖形

,然

後在同一個視圖視窗中畫出多個小圖形。

例5.1.3 在同一視窗中繪制線段。(見圖5.1.5)

>> x=0:pi/10:2*pi;

>> y1=sin(x);

>> y2=cos(x);

>> y3=x;

- 4 -

>> y4=log(x);

>> plot(x,y1,x,y2)

>> hold on

>> plot(x,y3)

>> plot(x,y4)

>> hold off

例5.1.4 在多個視窗中繪制圖形。(見圖5.1.6)

>> x=0:pi/10:2*pi;

>> y1=sin(x);

>> y2=cos(x);

>> y3=exp(x);

>> y4=log(x);

>> subplot(2,2,1);

>> plot(x,y1);

>> subplot(2,2,2);

>> plot(x,y2);

>> subplot(2,2,3);

>> plot(x,y3);

>> subplot(2,2,4);

>> plot(x,y4);

[說明] (1)子視窗的序号按行由上往下,按列從左向右編号。

(2)如果不用指令clf 清除,以後圖形将被繪制在子圖形視窗中。

圖5.1.4 設定坐标軸最大最小值的正弦曲線

- 5 -

圖5.1.5 圖形的比較顯示(曲線疊加方法)

圖5.1.6 圖形的比較顯示(圖形視窗分割方法)

- 6 -

5.2 三維立體圖形

5.2.1 三維曲線圖

與二維圖形相對應,MATLAB 提供了plot3 函數,可以在三維空間中繪制三維曲線,

它的格式類似于plot,不過多了z 方向的資料。plot3 的調用格式為:

plot3(x1,y1,z1,x2,y2,z2,...)

其中x1,y1,z1,x2,y2,z2,…等分别為維數相同的向量,分别存儲着曲線的三個坐标值,該

函數

的使用方式和plot 類似,也可以采用多種的顔色或線型(見表5.1.1)來區分不同的資料

組,

隻需在每組變量後面加上相關字元串即可實作該功能。

例5.2.1 繪制方程x=t

                y=sin(t)

                z=cos(t)

在t=[0,2*pi]上

的空間方程。(見圖5.2.1)

>> clf

>> x=0:pi/10:2*pi;

>> y1=sin(x);

>> y2=cos(x);

>> plot3(y1,y2,x,'m:p')

>> grid on

>> xlabel('Dependent Variable Y1')

>> ylabel('Dependent Variable Y2')

>> zlabel('Independent Variable X')

>> title('Sine and Cosine Curve')

圖5.2.1 函數plot 繪制的三維曲線圖

- 7 -

5.2.2 三維曲面圖

如果要畫一個三維的曲面,可以使用mesh(X,Y,Z)或surf(X,Y,Z)函數來實作。

mesh 函數為資料點繪制網格線,圖形中的每一個已知點和其附近的點用直線連接配接。surf

函數和mesh 的用法類似,但它可以畫出着色表面圖,圖形中的每一個已知點與其相鄰點以

平面連接配接。

為友善測試立體繪圖,MATLAB 提供了一個peaks 函數,它可以産生一個的高

斯分布矩陣,其生成方程是

N N ×

z=3*(1-x).^2.*exp(-(x.^2)-(y+1).^2)-10*(x/5-x.^3-y.^5).*exp(-x.^2-y.^2)-1/3*ex

p(-(x+1).^2-y.^2)

對應的圖形是一個凹凸有緻的曲面,包含了三個局部極大點及三個局部極小點。

下面使用peaks 函數來比較一下mesh 和surf 的差別。

例5.2.2 分别用mesh 函數和surf 函數繪制高斯矩陣的曲面。

>> z=peaks(40);

>> mesh(z);

>> surf(z);

圖5.2.2 mesh 函數繪制的三維曲面圖

- 8 -

圖5.2.3 surf 函數繪制的着色表面圖

在曲面繪圖中,另一個常用的函數是meshgrid 函數,其一般引用格式是:

[X, Y]=meshgrid (x, y)

其中x 和y 是向量,通過meshgrid 函數就可将x 和y 指定的區域轉換成為矩陣X 和Y。

這樣我們在繪圖時就可以先用meshgrid 函數産生在x-y 平面上的二維的網格資料,再以一

組z 軸的資料對應到這個二維的網格,即可畫出三維的曲面。

例5.2.3 繪制方程

     sin((x^2+y^2)^(1/2))

z = ---------------------

        (x^2+y^2)^(1/2)

在x∈[-7.5,7.5];y∈[-7.5,7.5] 的圖形。

>> x=-7.5:0.5:7.5;y=x;

>> [X,Y]=meshgrid(x,y);

>> R=sqrt(X.^2+Y.^2)+eps;

>> Z=sin(R)./R;

>> surf(X,Y,Z)

>> xlabel('X 軸方向')

>> ylabel('Y 軸方向')

>> zlabel('Z 軸方向')

(見圖5.2.4)

                                                  _(x^2+y^2)

例5.2.4 繪制由方程形成的立體圖。(見圖5.2.5) z=xe

>> clear

>> x=-2:0.1:2;y=x;

>> [X,Y]=meshgrid(x,y);

>> Z=X.*exp(-X.^2-Y.^2);

- 9 -

>> surf(X,Y,Z)

圖5.2.4

圖5.2.5

- 10 -

5.2.3 觀察點

MTALAB 允許使用者設定觀察點,其指令是: view(azimuth,elevation)

其中方位角azimuth 是觀察點和坐标原點連線在x-y 平面的投影和y 軸負方向的夾角,仰

elevation 是觀察點與坐标原點的連線和x-y 平面的夾角。對于這兩個角度,三維圖形的

預設

值分别是-37.5 和30,二維圖形的預設值是0 和90。

例5.2.5 從不同的角度觀察高斯矩陣的曲面。

>> z=peaks(40);

>> subplot(2,2,1);

>> mesh(z);

>> subplot(2,2,2);

>> mesh(z);

>> view(-37.5,-30);

>> subplot(2,2,3);

>> mesh(z);

>> view(180,0);

>> subplot(2,2,4);

>> mesh(z);

>> view(0,90);

圖5.2.6 對應不同觀察點的三維曲面圖

5.3 其他圖形函數

除了plot 繪圖函數以外,在有些場合對繪制的曲線會有一些特殊要求,這就要其他函

數來實作,常用的幾種函數如下(見表5.3.1)

- 11 -

表5.3.1 其他圖形函數表

函數含義

loglog 使用對數坐标系繪圖

semilogx 橫坐标為對數坐标軸,縱坐标為線性坐标軸

semilogy 橫坐标為線性坐标軸,縱坐标為對數坐标軸

polar 繪制極坐标圖

fill 繪制實心圖

bar 繪制直方圖

pie 繪制餅圖

area 繪制面積圖

quiver 繪制向量場圖

stairs 繪制階梯圖

sterm 繪制火柴杆圖

例5.3.1

>> x=0:pi/10:2*pi;

>> y1=sin(x);

>> subplot(2,2,1);

>> plot(x,y1);

>> subplot(2,2,2);

>> bar(x,y1);

>> subplot(2,2,3);

>> fill(x,y1,'g');

>> subplot(2,2,4);

>> stairs(x,y1,'k');

圖5.3.1 其他圖形函數

- 12 -

5.3.1 直方圖

函數bar(x)可以繪制直方圖,這對統計或者資料采集非常直覺實用。它共有四種形式:

bar,bar3,barh 和bar3h,其中bar 和bar3 分别用來繪制二維和三維豎直方圖,barh 和b

ar3h 分

别用來繪制二維和三維水準直方圖,調用格式是:

bar(x,y) 其中x 必須單調遞增或遞減,y 為n m× 矩陣,可視化結果為m 組,每

組n 個垂直柱,也就是把y 的行畫在一起,同一列的資料用相同的顔色表示;

bar(x,y,width) (或bar(y,width))指定每個直方條的寬度,如width>1,則直方條會重

疊,預設值為width=0.8;

bar(…,’grouped’) 使同一組直方條緊緊靠在一起;

bar(…,’stack’) 把同一組資料描述在一個直方條上。

例5.3.2

>> y=[5 3 2 9;4 7 2 7;1 5 7 3];

>> subplot(2,2,1),bar(y)

>> x=[5 9 11];

>> subplot(2,2,2),bar3(x,y)

>> subplot(2,2,3),bar(x,y,'grouped')

>> subplot(2,2,4),bar(rand(2,3),.75,'stack')

圖5.3.2 直方圖

5.3.2 面積圖

函數area 用來繪制面積圖,面積圖在plot 的基礎上填充x 軸和曲線之間的面積,該圖

用于檢視某個數在該列所有數的總和中所占的比例。

例5.3.3

>> x=-3:3;

>> y=[3 2 5;6 1 8;7 4 9;6 3 7;8 2 9;4 2 9;3 1 7];

>> area(x,y)

- 13 -

圖5.3.3 面積圖

5.3.3 餅圖

函數pie 用來繪制餅圖,它可以形象地表示出向量中各元素所占比例。其調用格式是:

pie(x) x 中的元素通過x/sum(x)進行歸一化,以确定餅圖中的份額;

pie(x,explode) 向量explode 和x 元素數相同,用來指出需要分開的餅片,explode 中

不為零的部分會被分開。

圖5.3.4 餅圖

- 14 -

例5.3.4 設某班的某課程的考試成績如下:90 分以上有32 人,81 至90 有58 人,71

至80 分有27 人,60 至70 分為21 人,60 分以下有16 人,畫出餅圖。(見圖5.3.4)

>> x=[32 58 27 21 16];

>> explode0=[1 0 0 0 0];

>> subplot(1,2,1)

>> pie(x,explode0)

>> explode1=[0 0 0 0 1];

>> subplot(1,2,2)

>> pie(x,explode1)

5.3.4 不同坐标系中的繪圖

Semilogx,semilogy,loglo,polar(theta,rho)的使用方法和plot 完全類似,不同的隻是繪

制到

不同的圖形坐标上。函數semilogx 繪制x 軸為對數标度的圖形,在半對數坐标系中繪圖;

函數semilogy 繪制y 軸為對數标度的圖形;函數loglog 繪制兩個軸都為對數間隔的圖形

函數polar(theta,rho)繪制極坐标圖形,其中theta 為相角,rho 為其對應的半徑。

例5.3.5 繪制ρ=acos(3θ),a=2 的圖形。(見圖5.3.5)

>> theta=-pi:pi/80:pi;

>> polar(theta,2*cos(3*theta))

圖5.3.5 極坐标圖

5.4 符号表達式繪圖

MATLAB 軟體提供了将表達式進行圖形顯示的功能。完成此功能需調用fplot 函數和

ezplot 函數。

- 15 -

函數fplot 用來繪制數學函數,其調用格式為: fplot(fun,lims)

其中fun 就是所要繪制的函數,可以是定義函數的M 檔案名,也可以是以x 為變量的可計

算字元串。例如’diric(x,10)’或’[sin(x),cos(x)]’,對于向量x 的每個元素,函數

fun(x)必須返

回一個行向量。如果fun 傳回[f1(x),f2(x),f3(x)],輸入[x1;x2],就會傳回矩陣

f1(x1) f2(x1) f3(x1)

f1(x2) f2(x2) f3(x2)

lims=[XMIN XMAX YMIN YMAX]限定了x,y 軸上的繪圖空間。

例5.4.1

>> subplot(2,2,1),fplot('humps',[0 1])

>> subplot(2,2,2),fplot('abs(exp(-j*x*(0:9))*ones(10,1))',[0 2*pi])

>> subplot(2,2,3),fplot('[tan(x),sin(x),cos(x)]',2*pi*[-1 1 -1 1])

>> subplot(2,2,4),fplot('sin(1./x)',[0.01 0.1],1e-3)

圖5.4.1 fplot 函數繪制表達式圖形

ezplot 函數是簡捷繪圖指令之一,它無需資料準備,直接畫出函數圖形,基本調用格式

為ezplot(f)

其中f 是字元串或代表數學函數的符号表達式,隻有一個符号變量,可以是x,預設情況下

x 軸的繪圖區域為] 2 , 2 [ π π ? ,但我們可以用ezplot(f,xmin,xmax)或ezp

lot(f,[xmin,xmax])來指

定x 的範圍。

例5.4.2

>> y='x^2';

>> subplot(1,2,1)

- 16 -

>> ezplot(y)

>> subplot(1,2,2)

>> y='sin(x)';

>> ezplot(y,[-pi,pi])

圖5.4.2 ezplot 函數繪制表達式圖形

5.5 plot 函數

MATLAB 對資料是按列存儲和計算的,運用plot(x)時,當x 為一個向量時,以其元

素為縱坐标,其序号為橫坐标值繪制曲線。當x 為實矩陣時,則以其序号為橫坐标,按列

制每列元素相對于序号的曲線,當x 為n m× 矩陣時,就有n 條曲線。

如果x,y 是同維向量,plot(x,y)指令以x 元素為橫坐标值,y 元素為縱坐标值繪制曲線。

如x 是向量,y 是有一維與x 元素數量相等的矩陣,則以x 為共同橫坐标,按列繪制y 每

元素值,曲線數為y 的另一維的元素數。如果x,y 是同維矩陣,則以x,y 對應列元素為、

坐标分别繪制曲線,數目等于矩陣的列數。

例5.5.1

>> x=[3 5 10 8];

>> subplot(2,2,1)

>> plot(x)

>> x=[3 5 10 8;7 2 9 4;2 7 2 7]';

>> subplot(2,2,2)

>> plot(x)

>> x=[3 5 6 8];

>> y=[1 5 10 4];

- 17 -

>> subplot(2,2,3)

>> plot(x,y)

>> x=[1 3 5 7;2 4 6 8]';

>> y=[6 2 5 10;3 5 2 6]';

>> subplot(2,2,4)

>> plot(x,y,'k:*')

圖5.5.1

5.6 互動式圖形指令

ginput 是一個比較特殊的圖形指令,用作擷取圖上資料,例如指令

>>[x,y]=ginput(6) % 從圖形上選取6 個點

此時,ginput 指令将把目前圖形調入前台,同時光标變為十字叉,移動光标,使交叉點落

目标點上,單擊滑鼠,即可獲得該點資料。

例5.5.2

>> fplot('humps',[0 1])

>> ginput(6)

x =

0.0449

0.1832

0.3007

0.3813

0.6417

0.8952

- 18 -

y =

7.4561

38.1579

96.3450

57.4561

10.9649

21.1988