1、MATLAB 程式設計入門篇 二維平面繪圖,張智星 jangcs.nthu.edu.tw http:/www.cs.nthu.edu.tw/jang 清大資工系 多媒體檢索實驗室,3-1 基本的繪圖指令,Plot : 最基本的繪圖指令 對 x 座標及相對應的 y 座標進行作圖範例3-1:plotxy01.m,x = linspace(0, 2*pi); % 在 0 到 2 間,等分取 100 個點 y = sin(x); % 計算 x 的正弦函數值 plot(x, y); % 進行二維平面描點作圖,Plot基本繪圖-1,linspace(0, 2*pi) 產生從 0 到 2且長度為 100 (
2、預設值)的向量 x y 是對應的 y 座標 只給定一個向量 該向量則對其索引值(Index)作圖 plot(y)和plot(1:length(y), y)會得到相同的結果,Plot基本繪圖-2 (I),一次畫出多條曲線 將 x 及 y 座標依次送入plot 指令 範例3-2:plotxy02.m,x = linspace(0, 2*pi); % 在 0 到 2 間,等分取 100 個點 plot(x, sin(x), x, cos(x), x, sin(x)+cos(x); % 進行多條曲線描點作圖,Plot基本繪圖-2 (II),Plot(x,sin(x), x, cos(x), x, si
3、n(x)+cos(x);,畫出多條曲線時,會自動輪換曲線顏色,Plot基本繪圖-3 (I),若要以不同的線標(Marker)來作圖範例3-3:plotxy03.m,x = linspace(0, 2*pi); % 在 0 到 2 間,等分取 100 個點 plot(x, sin(x), o, x, cos(x), x, x, sin(x)+cos(x), *);,Plot基本繪圖-3 (II),Plot基本繪圖-4 (I),只給定一個矩陣 y 對矩陣 y 的每一個行向量(Column Vector)作圖 範例3-4:plot04.m,y = peaks; % 產生一個 4949 的矩陣 plo
4、t(y); % 對矩陣 y 的每一個行向量作圖,Plot基本繪圖-4 (II),peaks 指令產生一個4949的矩陣,代表二維函數的值 plot(y) 直接畫出 49 條直線 類似於從側面觀看 peaks 函數,Plot基本繪圖-5 (I),x 和 y 都是矩陣 plot(x, y) 會取用 y 的每一個行向量和對應的 x 行向量作圖 範例3-5:plotxy05.m,x = peaks; y = x; % 求矩陣 x 的轉置矩陣 x plot(x, y); % 取用矩陣 y 的每一行向量,與對應矩陣 x % 的每一個行向量作圖,Plot基本繪圖-5 (II),提示,一般情況下,MATLAB
5、 將矩陣視為行向量的集合 對只能處理向量的函數(Ex : max、min、 mean) 給定一個矩陣,函數會對矩陣的行向量一一進行處理或運算,Plot基本繪圖-6 (I),z 是一個複數向量或矩陣 plot(z) 將 z 的實部(即 real(z)和虛部(即 imag(z)當成 x 座標和 y 座標來作圖, 其效果等於 plot(real(z), imag(z) 範例3-6:plotxy06.m,x = randn(30); % 產生 3030 的亂數(正規分佈)矩陣 z = eig(x); % 計算 x 的固有值(或稱特徵值) plot(z, o) grid on % 畫出格線,Plot基本
6、繪圖-6 (II),x 是一個 3030 的亂數矩陣 z 則是 x 的固有值(Eigenvalue,或特徵值) z 是複數向量,且每一個複數都和其共軛複數同時出現,因此畫出的圖是上下對稱,基本二維繪圖指令,Plot基本繪圖-7 (I),Semilogx指令 使 x 軸為對數刻度,對正弦函數作圖 範例plotxy07.m,x = linspace(0, 8*pi); % 在 0 到 8 間,等分取 100 個點 semilogx(x, sin(x); % 使 x 軸為對數刻度,並對其正弦函數作圖,Plot基本繪圖-7 (II),X軸為對數刻度,Plot基本繪圖-8 (I),plotyy 指令 畫
7、出兩個刻度不同的 y 軸 範例3-8:plotxy08.m,x = linspace(0, 2*pi); % 在 0 到 2 間,等分取 100 個點 y1 = sin(x); y2 = exp(-x); plotyy(x, y1, x, y2); % 畫出兩個刻度不同的 y 軸,分別是 y1, y2,Plot基本繪圖-8 (II),y1 的刻度是在左手邊 y2 的刻度是在右手邊 兩邊的刻度不同,Y1的刻度,Y2的刻度,3-2 圖形的控制,plot 指令,可以接受一個控制字串輸入 用以控制曲線的顏色、格式及線標 使用語法 plot(x, y, CLM) C:曲線的顏色(Colors) L:曲線
8、的格式(Line Styles) M:曲線所用的線標(Markers),圖形控制範例-1 (I),用黑色點線畫出正弦波 每一資料點畫上一個小菱形 範例3-9:plotxy09.m,x = 0:0.5:4*pi; % x 向量的起始與結束元素為 0 及 4, % 0.5為各元素相差值 y = sin(x); plot(x, y,k:diamond) % 其中k代表黑色,:代表點 % 線,而diamond 則指定菱形為曲 % 線的線標,圖形控制範例-1 (II),plot 指令的曲線顏色,plot 指令的曲線格式,plot 指令的曲線線標 (I),plot 指令的曲線線標 (II),3-3 圖軸的
9、控制,plot 指令會根據座標點自動決定圖軸範圍 也可以使用 axis 指令指定圖軸範圍 使用語法: axis(xmin, xmax, ymin, ymax) xmin , xmax:指定 x 軸的最小和最大值 ymin , ymax:指定 y 軸的最小和最大值,圖軸控制範例-1 (I),畫出正弦波在 y 軸介於 0 和 1 的部份 範例3-10:plotxy10.m,x = 0:0.1:4*pi; % 起始與結束元素為 0 及 4,0.1 為各 % 元素相差值 y = sin(x); plot(x, y); axis(-inf, inf, 0, 1); % 畫出正弦波 y 軸介於 0 和 1
10、 的部份,圖軸控制範例-1 (II),inf指令: 以資料點(上例: x 軸的資料點)的最小和最大值取代之,圖軸控制範例-2 (I),指定圖軸上的格線點(Ticks) 範例3-11:plotxy11.m,x = 0:0.1:4*pi; plot(x, sin(x)+sin(3*x) set(gca, ytick, -1 -0.3 0.1 1); % 在 y 軸加上格線點 grid on % 加上格線,圖軸控制範例-2 (II),grid on:加上格線 gca: get current axis的簡稱 傳回目前使用中的圖軸 gca屬Handle Graphics的指令,第七章會有更詳細的說明,
11、使用者加入的格線點和文字,圖軸控制範例-3 (I),將格線點的數字改為文字 範例3-12:plotxy12.m,x = 0:0.1:4*pi; plot(x, sin(x)+sin(3*x) set(gca, ytick, -1 -0.3 0.1 1); % 改變格線點 set(gca, yticklabel, 極小,臨界值,崩潰值,極大); % 改變格線點的文字 grid on % 加上格線,圖軸控制範例-3 (II),Subplot,subplot 在一個視窗產生多個圖形(圖軸) 一般形式為 subplot (m, n, p) 將視窗分為 m n 個區域 下一個 plot 指令繪圖於第 p
12、 個區域p 的算法為由左至右,一列一列,圖軸控制範例-4 (I),同時畫出四個圖於一個視窗中 範例3-13:plotxy13.m,x = 0:0.1:4*pi; subplot(2, 2, 1); plot(x, sin(x); % 此為左上角圖形 subplot(2, 2, 2); plot(x, cos(x); % 此為右上角圖形 subplot(2, 2, 3); plot(x, sin(x).*exp(-x/5); % 此為左下角圖形 subplot(2, 2, 4); plot(x, x.2); % 此為右下角圖形,圖軸控制範例-4 (II),Subplot(2,2,1),Subpl
13、ot(2,2,3),Subplot(2,2,2),Subplot(2,2,4),圖軸控制範例-5 (I),長寬比(Aspect Ratio) 一般圖軸長寬比是視窗的長寬比 可在 axis 指令後加不同的字串來修改 範例3-14:plotxy14.m,t = 0:0.1:2*pi; x = 3*cos(t); y = sin(t); subplot(2, 2, 1); plot(x, y); axis normal subplot(2, 2, 2); plot(x, y); axis square subplot(2, 2, 3); plot(x, y); axis equal subplot(
14、2, 2, 4); plot(x, y); axis equal tight,圖軸控制範例-5 (II),axis normal,axis equal,axis square,axis square tight,改變圖軸長寬比的指令,改變目前圖軸長寬比的指令 需在 plot 指令之後呼叫才能發揮效用,改變圖軸背景顏色的指令,colordef 改變圖軸與視窗之背景顏色 先呼叫 colordef 指令,其後 plot 指令產生的圖形才有效用,grid 和 box 指令,畫出格線或畫出圖軸外圍的方形,3-4 加入說明文字,在圖形或圖軸加入說明文字,增進整體圖形的可讀性,說明文字範例-1 (I),範例
15、3-15:plotxy15.m,subplot(1,1,1); x = 0:0.1:2*pi; y1 = sin(x); y2 = exp(-x); plot(x, y1, -*, x, y2, :o); xlabel(t = 0 to 2pi); ylabel(values of sin(t) and e-x) title(Function Plots of sin(t) and e-x); legend(sin(t),e-x);,說明文字範例-1 (II),legend 指令 畫出一小方塊,包含每條曲線的說明 為特殊符號 產生上標、下標、希臘字母、數學符號等 遵循一般 LaTex 或 Te
16、X數學模式,說明文字範例-2 (I),text指令 使用語法: text(x, y, string) x、y :文字的起始座標位置 string :代表此文字 範例3-16:plotxy16.m,x = 0:0.1:2*pi; plot(x, sin(x), x, cos(x); text(pi/4, sin(pi/4),leftarrow sin(pi/4) = 0.707); text(5*pi/4, cos(5*pi/4),cos(5pi/4) = -0.707rightarrow, HorizontalAlignment, right);,說明文字範例-2 (II),Horizonta
17、lAlignment及right指示 text 指令將文字向右水平靠齊,gtext指令,使用語法 gtext(string) 在圖上點選一位置後,string 顯示在其上。 gtext 只能用在二維平面繪圖,3-5 其他平面繪圖指令,各種二維繪圖指令,其他平面繪圖範例-1 (I),已知資料的誤差範圍,用 errorbar 表示 以 y 座標高度 20% 作為做資料的誤差範圍 範例3-17:plotxy17.m,x = linspace(0,2*pi,30); % 在 0 到 2 間,等分取 30 個點 y = sin(x); e = y*0.2; errorbar(x,y,e) % 圖形上加上
18、誤差範圍 e,其他平面繪圖範例-1 (II),誤差範圍,其他平面繪圖範例-2 (I),fplot 指令 對劇烈變化處進行較密集的取樣 範例3-18:plotxy18.m,fplot(sin(1/x), 0.02 0.2); % 0.02 0.2是繪圖範圍,其他平面繪圖範例-2 (II),此區作較精確的取點繪圖,其他平面繪圖範例-3 (I),polar 指令 產生極座標圖形 範例3-19:plotxy19.m,theta = linspace(0, 2*pi); r = cos(4*theta); polar(theta, r); % 進行極座標繪圖,其他平面繪圖範例-3 (II),直方圖及hi
19、st指令,直方圖(Histogram) 對大量的資料,顯示資料的分佈情況和統計特性 hist指令 將資料依大小分成數堆,將每堆的個數畫出,其他平面繪圖範例-4 (I),將 10000 個由 randn 產生的正規分佈之亂數分成 25 堆 範例3-20:plotxy20.m,x = randn(10000, 1); % 產生 10000 個正規分佈亂數 hist(x, 25); % 繪出直方圖,顯示 x 資料的分佈情%況和統計特性,數字 25 代表資料依%大小分堆的堆數,即是指方圖內長條%的個數 set(findobj(gca, type, patch), edgecolor, w); % 將長
20、條%圖的邊緣設定成白色,其他平面繪圖範例-4 (II),質方圖逼近亂數的機率分佈函數,且資料量越大時,逼近程度越高,其他平面繪圖範例-5 (I),rose指令 角度:資料大小 距離:資料個數 以極座標繪製表示 範例3-21:plotxy21.m,x = randn(5000, 1); % 產生 5000 個正規分佈的亂數 rose(x); % x 資料大小為角度,x 資料個數為距離,%以繪製類似玫瑰花瓣的極座標直方圖,其他平面繪圖範例-5 (II),其他平面繪圖範例-6 (I),compass 指令 畫出以原點為起始點的向量圖 稱為羅盤圖 範例3-22:plotxy22.m,theta = l
21、inspace(0, 2*pi, 50); rho = sin(0.5*theta); x, y = pol2cart(theta, rho); % 由極座標轉換至直角座標 compass(x, y); % 畫出以原點為向量起始點% 的羅盤圖,其他平面繪圖範例-6 (II),範例3-23:plotxy23.m,若只有一個引數輸入z 將 z 的實部做為 x 座標,將 z 的虛部做為 y 座標,再進行作圖 compass(z) 即等效於 compass(real(z),imag(z) 上述四列程式碼可簡化,theta = linspace(0, 2*pi, 50); compass(sin(0.5*theta).*exp(j*theta);,其他平面繪圖範例-7 (I),羽毛圖 起始點是 (k, 0),k = 1n ,其中 n 是向量個數 範例3-24:plotxy24.m,theta = linspace(0.2*pi,50); rho = 10; x, y = pol2cart(theta,rho); % 由極座標轉換至直角座標 feather(x, y); % 繪製羽毛圖,其他平面繪圖範例-8 (I),