張智星 (Roger Jang) jang@mirlab.org http://mirlab.org/jang 台大資工系 多媒體檢索實驗室 MATLAB 程式設計入門篇 二維平面繪圖 張智星 (Roger Jang) jang@mirlab.org http://mirlab.org/jang 台大資工系 多媒體檢索實驗室
3-1 基本的繪圖指令 最基本的繪圖指令:plot 對 x 座標及相對應的 y 座標進行描點作圖 範例3-1:plotxy01.m x = linspace(0, 2*pi); % 在 0 到 2*pi 間,等分取 100 個點 y = sin(x); % 計算 x 的正弦函數值 plot(x, y); % 進行二維平面描點作圖
Plot基本繪圖-1 說明 linspace(0, 2*pi) 產生從 0 到 2*pi且長度為 100 (預設值)的向量 x y 是對應的 y 座標 若只給定一個向量 則plot會進行該向量則對其索引值(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*pi 間,等分取 100 個點 plot(x, sin(x), x, cos(x), x, sin(x)+cos(x)); % 進行多條曲線描點作圖
Plot基本繪圖-2 (II) 畫出多條曲線時,會自動輪換曲線顏色 Plot(x,sin(x), x, cos(x), x, sin(x)+cos(x)); 畫出多條曲線時,會自動輪換曲線顏色
Plot基本繪圖-3 (I) 可以使用不同的線標(Marker)來作圖 範例3-3:plotxy03.m x = linspace(0, 2*pi); % 在 0 到 2*pi 間,等分取 100 個點 plot(x, sin(x), 'o', x, cos(x), 'x', x, sin(x)+cos(x), '*');
Plot基本繪圖-3 (II)
Plot基本繪圖-4 (I) 只給定一個矩陣 y,則plot(y)會對矩陣 y 的每一個行向量(Column Vector)作圖 範例3-4:plot04.m y = peaks; % 產生一個 49×49 的矩陣 plot(y); % 對矩陣 y 的每一個行向量作圖
Plot基本繪圖-4 (II) peaks 指令產生一個49×49的矩陣,代表二維函數的值 plot(y) 直接畫出 49 條直線
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) Hint: Why plot(x, x’, x’, x) generates a twisted mesh in the space? (Try it!)
提示 一般情況下,MATLAB 將矩陣視為行向量的集合 對於一般處理向量的函數(例如 max、min、 mean等),給定一個矩陣,函數會對矩陣的行向量一一進行處理或運算
Quiz a=[1 2; 3 4] plot(a) Plot(a, a’) Plot(a, a’, a’, a)
Quiz x=cos(t) y=sin(t) x=2*sin(t) y=cos(t)
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); % 產生 30×30 的亂數(正規分佈)矩陣 z = eig(x); % 計算 x 的「固有值」(或稱「特徵值」) plot(z, 'o') grid on % 畫出格線
Plot基本繪圖-6 (II) x 是一個 30×30 的亂數矩陣 z 則是 x 的「固有值」(Eigenvalue,或「特徵值」)
Coordinate Transformation Quiz! Quiz! How to prove exp(jq)=cosq +j*sinq? Quiz!
基本二維繪圖指令 指令 說明 Plot x 軸和 y 軸均為線性刻度(Linear Scale) loglog x 軸和 y 軸均為對數刻度(Logarithmic Scale) semilogx x 軸為對數刻度,y 軸為線性刻度 semilogy x 軸為線性刻度,y 軸為對數刻度 plotyy 畫出兩個刻度不同的y軸
Plot基本繪圖-7 (I) semilogx指令 會使x軸為對數刻度來進行作圖 範例plotxy07.m x = linspace(0, 8*pi); % 在 0 到 8*pi 間,等分取 100 個點 semilogx(x, sin(x)); % 使 x 軸為對數刻度,並對其正弦函數作圖
Plot基本繪圖-7 (II) X軸為對數刻度
Plot基本繪圖-8 (I) plotyy 指令 畫出兩個刻度不同的 y 軸 範例3-8:plotxy08.m x = linspace(0, 2*pi); % 在 0 到 2*pi 間,等分取 100 個點 y1 = sin(x); y2 = exp(-x); plotyy(x, y1, x, y2); % 畫出兩個刻度不同的 y 軸,分別是 y1, y2
Plot基本繪圖-8 (II) y1 的刻度是在左手邊 y2 的刻度是在右手邊 兩邊的刻度不同 y2的刻度 y1的刻度
3-2 圖形的控制 plot 指令,可以接受一個控制字串輸入 用以控制曲線的顏色、格式及線標 使用語法 plot(x, y, 'CLM') C:曲線的顏色 (Colors) L:曲線的樣式 (Line Styles) M:曲線資料點所用的線標 (Markers)
圖形控制範例-1 (I) 用黑色點線畫出正弦波 每一資料點畫上一個小菱形 範例3-9:plotxy09.m x = 0:0.5:4*pi; % x 向量的起始與結束元素為 0 及 4*pi, % 0.5為各元素相差值 y = sin(x); plot(x, y, ‘k:diamond’) % 其中「k」代表黑色,「:」代表點 % 線,而「diamond 」則指定菱形為曲 % 線的線標
圖形控制範例-1 (II)
Handle Graphics 事實上,我們可將畫出來的曲線看成一個物件,並進而改變物件的性質。 新範例:plotViaHg01.m x=0:0.5:4*pi; h=plot(x, sin(x)); % Plot a sin curve set(h, 'marker', 'o'); % Set marker to 'o' set(h, 'markerSize', 15); % Set marker size to 15 set(h, 'lineWidth', 5); % Set line width to 5 set(h, 'lineStyle', ':'); % Set line style to dot set(h, 'markerEdgeColor', 'g'); % Set marker edge color to green set(h, 'markerFaceColor', 'y'); % Set marker face color to yellow
Handle Graphics 結果如下:
Handle Graphics 我們也可以將所有性質一次塞進plot指令,畢其功於一役。以下範例和前一個範例的效果完全一樣: 新範例:plotViaHg02.m x=0:0.5:4*pi; plot(x, sin(x), 'marker', 'o', 'markerSize', 15, 'lineWidth', 5, 'lineStyle', ':', 'markerEdgeColor', 'g', 'markerFaceColor', 'y');
plot 指令的曲線顏色 Plot指令的曲線顏色字串 曲線顏色 RGB值 b 藍色(Blue) (0,0,1) c 青藍色(Cyan) (0,1,1) g 綠色(Green) (0,1,0) k 黑色(Black) (0,0,0) m 洋紅色(Magenta) (1,0,1) r 紅色(Red) (1,0,0) w 白色 (1,1,1) y 黃色(Yellow) (1,1,0)
plot 指令的曲線格式 plot 指令的曲線樣式字串 曲線樣式 - 實線(預設值) -- 虛線 : 點線 -. 點虛線
plot 指令的曲線線標 (I) plot 指令的曲線線標字串 線標說明 O 圓形 + 加號 X 叉號 * 星號 . 點號 ^ 朝上三角形 V 朝下三角形
plot 指令的曲線線標 (II) plot 指令的曲線線標字串 線標說明 > 朝右三角形 < 朝左三角形 square 方形 diamond 菱形 pentagram 五角星形 hexagram 六角星形 None 無符號(預設值)
3-3 圖軸的控制 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 的部份
圖軸控制範例-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的指令,第七章會有更詳細的說明 使用者加入的格線點和文字
獨立顯示各軸的格線 我們可以獨立顯示雙軸的格線 Result subplot(221); plot(humps); set(gca, 'xgrid', 'on'); subplot(223); plot(humps); set(gca, 'ygrid', 'on'); subplot(224); plot(humps); grid on;
圖軸控制範例-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) 下一個 plot 指令繪圖於第 p 個區域 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) subplot(2,2,2) subplot(2,2,3)
圖軸控制範例-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(2, 2, 4); plot(x, y); axis equal tight
圖軸控制範例-5 (II) axis normal axis square axis equal axis equal tight
改變圖軸長寬比的指令 改變目前圖軸長寬比的指令 需在 plot 指令之後呼叫才能發揮效用 指令 說明 axis normal 使用預設長寬比(等於圖形長寬比) axis square 長寬比例為 1 axis equal 長寬比例不變,但兩軸刻度一致 axis equal tight 兩軸刻度比例一致,且圖軸貼緊圖形 axis image 兩軸刻度比例一致(適用於影像顯示)
改變圖軸背景顏色的指令 colordef 改變圖軸與視窗之背景顏色 先呼叫 colordef 指令,其後 plot 指令產生的圖形才有效用 說明 colordef white 圖軸背景為白色,視窗背景為淺灰色 colordef black 圖軸背景為黑色,視窗背景為淺灰色 colordef none 圖軸背景和視窗背景均為黑色或淺灰色
grid 和 box 指令 畫出格線或畫出圖軸外圍的方形 指令 說明 grid on 畫出格線 grid off 取消格線 box on 畫出圖軸的外圍長方形 box off 取消圖軸的外圍長方形
3-4 加入說明文字 在圖形或圖軸加入說明文字,增進整體圖形的可讀性 指令 說明 title 圖形的標題 xlabel x 軸的說明 ylabel y 軸的說明 zlabel z 軸的說明(適用於立體繪圖) legend 多條曲線的說明 text 在圖形中加入文字 gtext 使用滑鼠決定文字的位置
說明文字範例-1 (I) 範例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 2\pi'); 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 或 TeX數學模式
說明文字範例-2 (I) text指令 使用語法: text(x, y, string) x、y :文字的起始座標位置 範例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(5\pi/4) = -0.707\rightarrow', 'HorizontalAlignment', 'right');
說明文字範例-2 (II) 「HorizontalAlignment」及「right」指示 text 指令將文字向右水平靠齊
gtext指令 使用語法 gtext(string) 在圖上點選一位置後,string 顯示在其上。 gtext 只能用在二維平面繪圖
3-5 其他平面繪圖指令 各種二維繪圖指令 指令 說明 errorbar 在曲線加上誤差範圍 fplot、ezplot 較精確的函數圖形 polar、ezpolar 極座標圖形 hist 直角座標直方圖(累計圖) rose 極座標直方圖(累計圖) compass 羅盤圖 feather 羽毛圖 area 面積圖(第五章「特殊圖形」介紹) stairs 階梯圖(第五章「特殊圖形」介紹)
其他平面繪圖範例-1 (I) 已知資料的誤差範圍,用 errorbar 表示 以 y 座標高度 20% 作為做資料的誤差範圍 範例3-17:plotxy17.m
其他平面繪圖範例-1 (II) 誤差範圍
其他平面繪圖範例-2 (I) fplot 指令 對劇烈變化處進行較密集的取樣 有同樣功能的函數:ezplot 範例3-18:plotxy18.m fplot('sin(1/x)', [0.02 0.2]); % [0.02 0.2]是繪圖範圍 以字串表示函數
其他平面繪圖範例-2 (II) 此區作較精確的取點繪圖
極座標圖形 polar 指令 Result 產生極座標圖形 plotxy19.m theta = linspace(0, 2*pi); r = cos(4*theta); % 進行極座標繪圖 polar(theta, r);
如何顯示繪圖順序 comet 指令 Result 產生動畫顯示 polarComet01.m theta = linspace(0, 4*pi, 10001); r=cos(4*theta); x=r.*cos(theta); y=r.*sin(theta); comet(x,y);
描點作圖以產生r=cos(2q) polarStep01.m Result Plots of r=cos(2q) in Cartesian and polar coordinates Press enter to see how the plot is transformed from Cartesian to polar coordinates Result
其他類似圖形:Rose Rose (玫瑰線): Wikipedia, MathWorld polarRose01.m
其他類似圖形:Cardioid Cardioid (心臟線): Wikipedia polarCardioid01.m
Quiz r=cos(q) r=cos(2q) r=1+sin(q) r=1+cos(q)
Lissajous Curve Lissajous curve (利薩茹曲線): lissajous01.m Wikipedia: English, Chinese lissajous01.m
描點作圖以產生利薩茹曲線 lissajousStep01.m Result Plots of x(t)=cos(2t) & y(t)=sin(t) as the original and composite curves Press enter to see how the plot is combined from the original curves to the composite one Result
Quiz x=cos(t) y=sin(2*t) x=cos(2*t) y=sin(t)
Spirograph (萬花尺) Spirograph Wikipedia: English, Chinese See exercise.
直方圖及hist指令 直方圖(Histogram) hist指令 對大量的資料,顯示資料的分佈情況和統計特性 若資料量夠大,直方圖會逼近於這些資料的機率密度函數(PDF, probability density function) hist指令 將資料依大小分成數堆,將每堆的個數畫出
直方圖範例 將 10000 個由 randn 產生的正規分佈之亂數分成 25 堆 Result plotxy20.m % 產生 10000 個正規分佈亂數 x = randn(10000, 1); % 繪出直方圖,分成25堆 hist(x, 25);
直方圖比較 (1/2) 直方圖逼近原資料的機率密度函數,且資料量越大時,逼近程度越高 Result n=100000; bin=100; subplot(211); hist( rand(n, 1), bin); title('Uniform distribution'); subplot(212); hist(randn(n, 1), bin); title('Normal distribution');
直方圖比較 (2/2) Comparison of histograms Result plotxy202.m n=100000; subplot(231); x=rand(n, 1); hist(x, 100); subplot(232); x=rand(n, 1); hist(x.^3, 100); subplot(233); x=rand(n, 1); hist(nthroot(x, 3), 100); subplot(234); x=randn(n, 1); hist(x, 100); subplot(235); x=randn(n, 1); hist(x.^3, 100); subplot(236); x=randn(n, 1); hist(nthroot(x, 3), 100); Quiz!
極座標直方圖 (I) rose指令 角度:資料大小 距離:資料個數 以極座標繪製表示 範例3-21:plotxy21.m x = randn(5000, 1); % 產生 5000 個正規分佈的亂數 rose(x); % x 資料大小為角度,x 資料個數為距離, %以繪製類似玫瑰花瓣的極座標直方圖
極座標直方圖(II)
羅盤圖(I) compass 指令 畫出以原點為起始點的向量圖 範例3-22:plotxy22.m theta = linspace(0, 2*pi, 50); rho = sin(0.5*theta); [x, y] = pol2cart(theta, rho); % 由極座標轉換至直角座標 compass(x, y); % 畫出以原點為向量起始點 % 的羅盤圖
羅盤圖(II) 若只有一個引數輸入z 將 z 的實部做為 x 座標,將 z 的虛部做為 y 座標,再進行作圖 範例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));
羽毛圖 feather指令 Result 向量起始點是 (k, 0),k = 1~n ,其中 n 是向量個數 plotxy24.m theta = linspace(0, 4*pi, 30); rho = 10; % 由極座標轉換至直角座標 [x, y] = pol2cart(theta, rho); % 繪製羽毛圖 feather(x, y); axis image