1. 程式人生 > >Matlab畫圖詳解

Matlab畫圖詳解

一. 二維圖形(Two dimensional plotting)
1. 基本繪圖函式(Basic plotting function):Plot, semilogx,   semilogy, loglog, polar, plotyy
(1). 單向量繪圖(single vector plotting):plot(y),向量y的元素與y元素下標之間線上性座標下的關係曲線
例1:單向量繪圖
y=[0 0.6 2.3 5 8.3 11.7 15 17.7 19.4 20]; plot(y)

可以在圖形中加標註和網格
例2:給例1 的圖形加網格和標註。
y=[0 0.6 2.3 5 8.3 11.7 15 17.7 19.4 20]; plot(y)
title('簡單繪圖舉例'); xlabel('單元
下標'); ylabel('給定的向量'); grid
(2). 雙向量繪圖(Double vector plotting):如x和y是同樣長度的向量, plot(x,y)命令將繪製y元素對應於x元素的xy曲線圖。
例:雙向量繪圖。
    x=0:0.05:4*pi; y=sin(x); plot(x,y)
(3). 對數座標繪圖(ploting in logarithm coordinate): x軸對數 semilogx,   y軸對數semilogy, 雙對數loglog,
例:繪製陣列y的線性座標圖和三種對數座標圖。
y=[0 0.6 2.3 5 8.3 11.7 15 17.7 19.4 20];
subplot(2,2,1); plot(y); subplot(2,2,2); semilogx(y)
subplot(2,2,3); semilogy(y); subplot(2,2,4); loglog(y)
(4)極座標繪圖( Plotting in polar coordinate):  
polar(theta,rho) theta—角度,   rho—半徑
例:建立簡單的極座標圖形。
t=0:.01:2*pi; polar(t,sin(2*t).*cos(2*t))

2. 多重曲線繪圖(Multiple curve plotting)
(1)一組變數
繪圖(A group variable plotting)
plot(x,y)
(a) x為向量,y為矩陣時plot(x,y)用不同的顏色繪製y矩陣中各行或列對應於x的曲線。
例1:
   x=0:pi/50:2*pi; y(1,: )=sin(x); y(2,:) =0.6*sin(x); y(3, :)=0.3*sin(x); plot(x,y)

(b) x為矩陣,y為向量時繪圖規則與(a)的類似,只是將x中的每一行或列對應於y進行繪圖。。
例 2:
x(1,: )=0:pi/50:2*pi; x(2,: )=pi/4:pi/50:2*pi+pi/4; x(3,: )=pi/2:pi/50:2*pi+pi/2;
y=sin(x(1,: )); plot(x,y)

(c) x和y是同樣大小的矩陣時, plot(x,y)繪製y矩陣中各列對應於x各列的圖形。
例3:
x(:,1 )=[0:pi/50:2*pi]'; x(:,2 )=[pi/4:pi/50:2*pi+pi/4]'; x(:,3 )=[pi/2:pi/50:2*pi+pi/2]';
y(:,1 )=sin(x(:,1 )); y(:,2 )=0.6*sin(x(:,1)); y(:,3 )=0.3*sin(x(:,1));
plot(x,y)

這裡x和y的尺寸都是101×3,所以畫出每條都是101點組成的三條曲線。如行列轉置後就會畫出101條曲線,每條線由三點組成。
x(1,:)=[0:pi/50:2*pi]; x(2,:)=[pi/4:pi/50:2*pi+pi/4]; x(3,:)=[pi/2:pi/50:2*pi+pi/2];
y(1,:)=sin(x(1,:)); y(2,:)=0.6*sin(x(1,:)); y(3,:)=0.3*sin(x(1,:));
plot(x,y)

(d) 如果y是矩陣,則plot(y)繪出y中各列相對於行號的圖形,對於n行矩陣,x軸的座標為[1:n]。
(2)多組變數繪圖( Multiple group variables plotting):
對於一系列相應的矩陣yi和xi, 可以使用多組變數繪圖法:plot(x1,y1,x2,y2,…,xn,yn),
這種方法的優點是允許將不同大小的矩陣或向量的圖形繪製在一張圖上。
例:多組變數繪圖。
x=0:pi/50:2*pi; y1=sin(x); y2=0.6*sin(x); y3=0.3*sin(x); plot(x,y1,x,y2,x,y3)

(3)雙y軸繪圖:plotyy,
在一個圖形視窗繪製兩組資料
曲線,共用一個x軸,圖形兩邊各有一個y軸。兩條圖線可以呼叫不同的繪圖方法。
例1:
x=0:0.3:12; y=exp(-0.3*x).*sin(x)+0.5; plotyy(x,y,x,y,'plot','stem')

左側y軸對應plot形式的繪圖,右側y軸對應stem形式的曲線。
例2: 對於y座標不同的情況。
t=0:900; A=1000; a=0.005; b=0.005; z1=A*exp(-a*t); z2=sin(b*t);
plotyy(t,z1,t,z2,'semilogy','plot')
3. 圖線形式和顏色(Style and color of plot)
(1)     圖線的形式: (style of plot)MATLAB提供的四種線形,
實線    虛線- - , 冒號線   : ,點劃線 -- .
標記點型別: .   , + , *,   o, ×, s (或square),   d (或diamond), △, ▽, <,   >, p (或pentagram),   h (或hexagram),
plot(x,y,’—‘), plot(x1,y1,’:’,x2,y2,’*’)
例1:選擇不同的線形繪圖。   
t=0:pi/100:2*pi; y=sin(t); y2=sin(t-0.25); y3=sin(t-0.5);
plot(t,y,'-',t,y2,'-',t,y3,':')
例2:選擇不同的標記點繪圖。
   t=0:pi/20:2*pi; x=t.^3; y=sin(t); plot(x,y,'o')
(2) 線的顏色(color of plot): MATLAB中可選的顏色: 紅r,綠g,
藍b, 黃y, 粉紅m, 青c(cyan) 黑k.
例:t=0:pi/20:2*pi;
y=sin(t); plot(x,y,'r'), plot(x,y,'g+')
(3) 圖線的其他屬性(other characters of plot): 可設定圖線的寬度、標記點的邊緣顏色、填充顏色、標記點的大小等。
   例: 設定圖線的線形、顏色、寬度、標記點的顏色及大小。
t=0:pi/20:pi; y=sin(4*t).*sin(t)/2;
plot(t,y,'-bs','LineWidth',2,'MarkerEdgeColor','k', 'MarkerFaceColor', 'y','MarkerSize',10)
4. 複數繪圖(Complex plotting): plot用於函式繪製複數的圖形時,通常虛部是被忽略的。但plot只作用於單個復變數z時,則繪出的是實部對虛部的關係圖(複平面上的一組點)。即這時plot(z)等價於 plot(real(z)).
例: 畫一個20 邊的多邊形(用exp函式生成),頂角用小圓圈表示。
t=0:pi/10:2*pi; plot(exp(i*t),'o'); axis('square')
如果在複平面繪製多重線 ,只能分別以實部和虛部為座標來繪製,否則虛部將被忽略,並給出警告。
二. 圖形的控制與表現(Figure control and representation)
MATLAB提供的用於圖形控制的函式和命令:
axis: 人工選擇座標軸尺寸.
clf: 清圖形視窗.
ginput: 利用滑鼠的十字準線輸入.
hold:   保持圖形.
shg: 顯示圖形視窗.
subplot: 將圖形視窗分成N塊子視窗。

1. 圖形視窗(figure window)
(1). 圖形視窗的建立和選擇(Creating and selecting of figure window)
figure(n)函式用於為當前的繪圖建立圖形視窗,每執行一次figure就會建立一個新的圖形視窗,n表示第個n視窗,如果視窗定義了控制代碼,也可以用figure(h)將控制代碼h的視窗作為當前視窗。
clf 命令用於清除當前圖形視窗中的內容。
shg命令用於顯示當前圖形視窗。
(2). 在一個圖形視窗中繪製多個子圖形(Drawing several subfigures in a single window)
subplot(m,n,p), 把視窗分成m×n個小視窗,並把第p個視窗當作當前視窗。
例:將4 個圖形顯示在同一個圖形視窗中。
t=0:pi/20:2*pi; [x,y]=meshgrid(t);
subplot(2,2,1); plot(sin(t),cos(t)); axis equal
subplot(2,2,2); z=sin(x)+cos(y); plot(t,z); axis([0 2*pi –2 2])
subplot(2,2,3); z=sin(x).*cos(y); plot(t,z); axis([0 2*pi –1 1])
subplot(2,2,4); z=sin(x).^2-cos(y).^2; plot(t,z); axis([0 2*pi –1 1])
(3). 在一個已有的圖形上繪圖(Drawing a figure on the figure was existed):
用hold on命令在一個已有的圖形上繼續繪圖,使用hold off命令結束繼續繪圖。
例:將peaks函式的等高線圖與偽彩色畫在一起。
[x,y,z]=peaks;          %產生雙變數陣列
contour(x,y,z,20,'k')        %繪製等高線
hold on
pcolor(x,y,z)             %繪製偽彩色圖
shading interp          %表面色彩渲染
hold off
2. 座標軸控制命令(Axis control commands)
   控制座標性質的axis函式的多種呼叫格式:
axis(xmin xmax ymin ymax):指定二維圖形x和y軸的刻度範圍,
axis auto                設定座標軸為自動刻度(預設值)
axis manual(或axis(axis))   保持刻度不隨資料的大小而變化
axis tight                以資料的大小為座標軸的範圍
axis ij        設定座標軸的原點在左上角,i為縱座標,j為橫座標
axis xy        使座標軸回到直角座標系
axis equal     使座標軸刻度增量相同
axis square 使各座標軸長度相同,但刻度增量未必相同
axis normal 自動調節軸與資料的外表比例,使其他設定失效
axis off        使座標軸消隱
axis on        顯現座標軸
(1)     座標軸的範圍(Domain of coordinates axis):
二維圖形座標軸範圍在預設狀態下是根據資料的大小自動設定的,如欲改變,可利用axis(xmin xmax ymin ymax),函式來定義。
例: 定義座標軸範圍對觀察圖形的影響。
x=0:.01:pi/2; figure(1); plot(x,tan(x),'-ro')     %ymax=tan(1.57),而其他資料都很小,結果
%使圖形難於進行觀察和判斷。
figure(2); plot(x,tan(x),'-ro'); axis([0, pi/2,0,5])   %對座標軸的範圍進行控制就可得到較滿意的繪圖結果
(2)顯示比例對繪圖結果的影響(Effect of display scaling on plotting results)
例:比較(Default, axis square, axis equal, axis tight)幾種不同的顯示方式的顯示效果。
t=0:pi/20:2*pi; figure(1);
subplot(2,1,1); plot(sin(t),2*cos(t)); grid on     %預設狀態下的圖形比例
subplot(2,1,2); plot(sin(t),2*cos(t)); axis square; grid on    %正方形的顯示比例
figure(2)
subplot(1,2,1); plot(sin(t),2*cos(t)) ; axis equal; grid on           %具有相等的刻度比例
subplot(1,2,2); plot(sin(t),2*cos(t)); axis tight ; grid on              %緊縮形式

3. 圖形標註(Marking on the figure):MATLAB的圖形標註方法(表 6—7)
title    標題,
xlabel     x軸標註,
ylabel     y軸標註,
text    任意定位的標註                      
gtext    滑鼠定位標註,
legent     標註圖例
圖形標註可以使用字母,數字,漢字或按規定的方法表示希臘字母,如\pi表示π,\leq表示≤,\rm表示後面的字恢復為正體字,\it表示斜體字,FontSize表示字型的大小, FontName表示字型的型別等。
   可以使用圖形視窗的 Insert選單,也可以使用屬性編輯器,還可以使用函式輸入的方法加標註,以下介紹相關函式的使用方法。
(1). 加註座標軸標識和圖形標題(Add axis labels and title of figure)
加註座標軸標識:xlabel(‘s’), ylabel(‘s’)
圖形標題: title(‘s’)
例:加註座標軸標示和圖形標題。
t=0:pi/100:2*pi;y=sin(t);
plot(t,y)
axis([0 2*pi,-1 1])
xlabel('0 \leq \itt \rm \leq \pi','FontSize',16)
ylabel('sin(t)','FontSize',20)
title('正弦函式圖形','FontName','隸書','FontSize',20)
(2). 圖中加註文字(Add text in the figure)
text(x,y,’字串’)
例:在上圖中加語句。
t=0:pi/100:2*pi;
y=sin(t);
plot(t,y)
axis([0 2*pi,-1 1])                              
xlabel('0 \leq \itt \rm \leq \pi','FontSize',16)
ylabel('sin(t)','FontSize',20)
title('正弦函式圖形','FontName','隸書','FontSize',20)
text(3*pi/4,sin(3*pi/4),'\leftarrowsin(t)=0.707', 'FontSize',16)
text(pi,sin(pi),'\leftarrowsin(t)=0', 'FontSize',16)
text(5*pi/4,sin(5*pi/4),'sin(t)=-0.707\rightarrow','FontSize',16, ...
'HorizontalAlignment','right')
句中:
leftarrow 表示加一個向左的箭頭
rightarrow表示加一個向右的箭頭
HorizontalAlignment 表示右對齊水平排列
gtext函式用於在圖形視窗上用滑鼠直接在指定的位置上加註文字,呼叫格式:gtext(‘字串‘)
例:
t=0:pi/100:2*pi;
y=sin(t);
plot(t,y)
axis([0 2*pi,-1 1])
xlabel('0 \leq \itt \rm \leq \pi','FontSize',16)
ylabel('sin(t)','FontSize',20)
title('正弦函式圖形','FontName','隸書','FontSize',20)
gtext('MATLAB')
(3). 指定TeX字元
例:在標題中指定TeX字元
t=0:pi/100:2*pi;
alpha=-0.8;
beta=15;
y=sin(beta*t).*exp(alpha*t);
plot(t,y)
title('{\itAe}^{-\it\alpha\itt}sin\it\beta{\itt}\it\alpha<<\it\beta')
xlabel('時間\mus.'),
ylabel('幅值')
在title中的字串表現的是 Aeαt   sinβt   α<<β
{\itAe}^{-\it\alpha\itt} sin\it\beta{\itt}\it\alpha<<\it\beta’
斜體Ae 上標斜體αt 斜體βt     斜體α 斜體β
4.在圖形中新增圖例框(Add legend in the figure)
legend(字串1, 字串2,…)
例:在當前圖形中新增圖例說明。
x=0:pi/10:2*pi;
y1=sin(x);
y2=0.6*sin(x);
y3=0.3*sin(x);
plot(x,y1,x,y2,'-o',x,y3,'-*')
legend( '曲線1','曲線2','曲線3')
legend('boxoff')
legend函式的其他功能見(表 6—8)

三. 特殊圖形(Special figure)
1. 條形圖(Bar figure): bar(y), bar(x,y), barh, bar3(y), bar3(x,y), bar3h(x,y)
(1) 二維條形圖 :bar(y), bar(x,y), barh,
(a).如果y是向量,bar(y) 繪製最簡單的條形圖, 每一個條形圖的位置由y元素的下標決定,高度由y元素的大小決定。
例1:
a=[1 3 5;4 3 7;2 8 4]; bar(a)
(b) 當y是m×n階的矩陣時,bar(y) 繪製的條形圖以分組或疊加的形式表現。矩陣中每一行元素繪製在一組中,每一列元素繪製在每組中相對應的位置上(各組中同樣顏色的條形表示同一列資料)。
例2:
y=[9 8 6;2 5 8;6 2 9;5 8 7;9 4 2]; bar(y)
例3:繪製分組形式的水平條形圖。
y=[9 8 6;2 5 8;6 2 9;5 8 7;9 4 2]; barh(y)
例4:繪製疊加形式的條形圖。
y=[9 8 6;2 5 8;6 2 9;5 8 7;9 4 2]; bar(y,’stack’)
例5:繪製疊加形式的水平條形圖。
y=[9 8 6;2 5 8;6 2 9;5 8 7;9 4 2]; barh(y,'stack')
(b) 使用bar(x,y)繪製指定x座標的條形圖,其中x必須是向量,用於確定各組條形圖的位置。
例1:指定x座標的二維條形圖,
x=[1 2 4 7 10]; y=[9 8 6;2 5 8;6 2 9;5 8 7;9 4 2]; bar(x,y)
例2:指定x座標的水平二維條形圖,
x=[1 2 4 7 10]; y=[9 8 6;2 5 8;6 2 9;5 8 7;9 4 2]; barh(x,y)
例3:繪製指定x座標的疊加形式的二維條形圖。
x=[1 2 4 7 10]; y=[9 8 6;2 5 8;6 2 9;5 8 7;9 4 2]; bar (x,y,'stack')
如果y也是向量,對應每一個x座標有一個條形,條形的高度表示了向量y元素的大小。
例4:
x=0:pi/10:2*pi; y=sin(x); bar(x,y)
(2). 三維條形圖:bar3(y),將m×n階的矩陣繪製成分佈在三維空間中的柱體,有分組形式和分列形式兩種。
例1:分組形式的三維條形圖。
y=[9 8 6;2 5 8;6 2 9;5 8 7;9 4 2]; bar3 (y,'group')
例2:分列形式的三維條形圖。
y=[9 8 6;2 5 8;6 2 9;5 8 7;9 4 2]; bar3 (y)
(3)條形圖中的圖形疊加:通過在相同的位置建立一個與原來條形圖中的座標軸相對獨立的新的座標軸實現條形圖的疊加。
例: 有兩組實驗資料,一組表示物質成分(TCE),一組表示溫度(temp),資料是在35天中每隔5天的取樣,將物質成分和溫度與時間的關係畫在一張圖中。
TCE=[515 420 370 250 135 120 60 20]; %實驗資料
temp=[29 23 27 25 20 23 23 27];
days=0:5:35;                      %取樣天數
bar(days,temp,'c')                    %溫度與時間的條形圖
xlabel('Day')
ylabel('Temperature (^{o}C)')
h1=gca;                             %獲取當前軸物件控制代碼
h2=axes('position',get(h1,'position'));
%建立新的與h1位置相同的物件控制代碼
plot(days,TCE,'LineWidth',3)   
%在以為控制代碼的座標物件上繪製物質成分與時間的關係曲線
set(h2,'YaxisLocation','right','color','none','Xticklabel',[])
%設定控制代碼為h2的座標軸物件的y軸為右側。
set(h2,'Xlim',get(h1,'Xlim'),'Layer','top')
%設定控制代碼為h2的座標軸物件的x軸的範圍與控制代碼為h1 的%座標軸物件軸的範圍相同。
text(11,380,'Concentration','Rotation',-55,'FontSize',16)
% 在座標為 [11,380] 的位置以旋轉-55°%的方向書寫concentration
ylabel('TCE Concentration (PPM)')

title('Bioremediation','FontSize',16)
餅圖(pie): 用於表示向量或矩陣中各元素所佔有的比例。, 函式pie和pie3提供平面餅圖和三維餅圖的繪圖功能。
   *pie(x) 使用x中的資料繪製餅圖,x中的每一個元素用餅圖中的一個扇區表示。
*pie(x,explode) 將一些扇區從餅圖中分離出來,explode為一個與 x尺寸相同的矩陣,其非零元素所對應的x矩陣中的元素從餅圖中分離出來。
(1) 不分離餅圖: pie(x)
例1:不分離餅圖:
x=[5.5 74.7 44.5 33.2 46.6]; pie(x)
(2) 帶分離切塊的餅圖:在向量x的後面加一個與x相同長度的向量,該向量中所有不為0的元素所對應的向量x中的切塊將被分離出來。
例2:
x=[5.5 74.7 44.5 33.2 46.6]; pie(x,[0 0 0 0 1])       %分離第5塊
(3) 不完整的餅圖:當x的全部元素之和小於1時繪製的是不完整餅圖。
例3:
x=[0.2 0.3 0.4]; pie(x)
(4) 三維餅圖:有一定厚度的餅圖, 由函式pie3實現,呼叫方法與二維餅圖相同。
例:帶分離切塊的三維餅圖。
pie3([1 2 3 4 5],[0 1 0 1 0])
3. 其他圖形(Other figures): MATLAB有20多種特殊圖形的繪製方法,下述為常用方法。
(1)直方圖(hist): 一種統計運算的結果,它的橫軸是資料的幅度,縱軸是對應於各個幅度資料出現的次數,直方圖沒有負數。
例 1:直角座標系下向量的直方圖。
   yn=randn(10000,1);
figure(1)
hist(yn)    %預設狀態下畫10個條形
figure(2)
hist(yn,20)    %可以設定n個條形個數
例2:直角座標系下的三維陣列的直方圖。
y=randn(10000,3);
figure(1)
hist(y)    %預設狀態下畫10個條形
figure(2)
hist(y,20)    %hist(y,n)可以設定條形個數為n
(2) 用桿狀圖表現離散資料
例1:二維桿狀圖。
x=0:0.2:10; y=exp(-0.3*x).*sin(x);
figure(1); stem(x,y)
figure(2); stem(x,y,':sr')    %可用字串改變線形、標記點形狀和顏色
例2: 用三維桿狀圖表現複平面快速傅立葉變換計算。
th=(0:127)/128*2*pi; x=cos(th); y=sin(th); f=abs(fft(ones(10,1),128));
stem3(x,y,f','d','fill')
xlabel('實部'); ylabel('虛部'); zlabel('幅值')
title('頻率響應幅值')
例2:用三維桿狀圖與其他圖形的疊加表現拉普拉斯變換基函式。
t=0:0.1:10; s=0.1+i; y=exp(-s*t);                         %計算延遲指數
stem3(real(y),imag(y),t,'m'); hold on
hline=(plot3(real(y),imag(y),t,'k')        %返回三維曲線圖的控制代碼
hold off; set(hline,'LineWidth',3)             %設定線寬
xlabel('實部'); ylabel('虛部'); zlabel('幅值')
(3) 階梯圖
階梯圖的表現方法:呼叫函式stairs(x,y),每一階梯的起始點為向量y的資料點。
(STAIRS(X,Y) draws a stairstep graph of the elements in vector Y at
the locations specified in X.   The X-values must be in
ascending order and evenly spaced.)
例:繪製函式 階梯圖。
alpha=0.01; beta=0.5; t=0:10; f=exp(-alpha*t).*sin(beta*t);
stairs(t,f); hold on; plot(t,f,':*')          %繪製虛線圖以說明階梯圖階梯起始點的位置
hold off; label='函式e^{-(\alpha*t)} sin\beta*t的階梯圖';
text(0.5,-0.2,label,'FontSize',14); xlabel('t=0:10','FontSize',14); axis([0 10 -1.2 1.2])
(4) 彩色分散點圖(Color scatter figure)
彩色分散點圖函式:scatter(x,y,c,s) x, y為兩個向量,用於定位資料點,s為繪圖點的大小,c為繪圖所使用的色彩,s和c均可以以向量或表示式形式給出,s和c為與x或y同長度的向量時標記點尺 寸和顏色將按線性規律變化。在 scatter函式的前4各引數之後還可以增加第五個引數‘ filled‘,表示填充繪圖點。Scatter與plot 的最大差別在於Scatter可以繪製變尺寸、變顏色的點圖。
例:給定資料t=0:pi/10:2*pi, y=sin(t),觀察在不同輸入引數時函式的繪圖結果。
t=0:pi/10:2*pi; y=sin(t)
subplot(3,2,1); scatter(t,y)
subplot(3,2,2); scatter(t,y,'v')
subplot(3,2,3); scatter(t,y,(abs(y)+2).^4,'filled')
subplot(3,2,4); scatter(t,y,30,[0:2: 40],'v','filled')
subplot(3,2,5); scatter(t,y,(t+1).^3,y,'filled')