1、MATLAB 程式設計入門篇 特殊圖形,張智星 jangcs.nthu.edu.tw http:/www.cs.nthu.edu.tw/jang 清大資工系 多媒體檢索實驗室,5-1 長條圖之繪製,長條圖 (Bar Graphs)特別適用於少量且離散的資料。欲畫出垂直長條圖,可用 bar 指令。範例5-1:bar01.mx = 1 3 4 5 2;bar(x);,Fig. 5-1,5-1 長條圖之繪製(cont.),bar 指令也可接受矩陣輸入,它會將同一橫列的資料聚集在一起。範例5-2:bar02.mx = 2 3 4 5 7; 1 2 3 2 1;bar(x);,Fig. 5-2,5-1
2、長條圖之繪製(cont.),bar 及 barh 指令還有一項特異功能,就是可以將同一橫列的資料以堆疊(Stack)方式來顯示。範例5-3:bar03.mx = 2 3 4 5 7; 1 2 3 2 1;bar(x,stack),Fig. 5-3,5-1 長條圖之繪製(cont.),除了平面長條圖之外,MATLAB 亦可使用 bar3 指令來畫出立體長條圖。範例5-4:bar04.mx = 2 3 4 5 7; 1 2 3 2 1;bar3(x),Fig. 5-4,5-1 長條圖之繪製(cont.),bar3 指令還可以使用群組(Group)方式來呈現長條圖範例5-5:bar05.mx = 2
3、 3 4 5 7; 1 2 3 2 1;bar3(x, group),Fig. 5-5,5-1 長條圖之繪製(cont.),長條圖的指令和類別 :,5-1 長條圖之繪製(cont.),若要指定長條圖的 x 座標,可使用兩個輸入向量給 bar 指令。假設新竹的月平均溫度如下:範例5-6:bar06.m x = 1:6; % 月份 y = 35*rand(1, 6); % 溫度值(假設是介於 035 的亂數) bar(x, y); xlabel(月份); % x 軸的說明文字 ylabel(平均溫度 (oc); % y 軸的說明文字 % 下列指令將 x 軸的數字改成月數 set(gca, xtic
4、klabel, 一月,二月,三月, 四月, 五月, 六月);,5-1 長條圖之繪製(cont.),Fig. 5-6,5-2 面積圖之繪製,面積圖(Area Graphs)和以堆疊方式呈現的長條圖很類似,特別適用於具有疊加關係的資料。舉例來說,若要顯示清華大學在過去 10 年來的人數(含大學部,研究生,及教職員)變化情況,可用面積圖顯示。範例5-7:area01.my = rand(10,3)*100;x = 1:10;area(x, y);xlabel(Year);ylabel(Count),Fig. 5-7,5-3 扇形圖之繪製,使用 pie 指令,可畫出平面扇形圖(Pie Charts),
5、並可加上說明。範例5-8:pie01.mx = 2 3 5 4;label=東,南,西,北;pie(x, label);,Fig. 5-8,5-3 扇形圖之繪製(cont.),pie 指令直接將 x 元素視為面積百分比,因此可畫出不完全的扇形圖。範例5-9:pie02.mx = 0.21, 0.14, 0.38;pie(x);,Fig. 5-9,5-3 扇形圖之繪製(cont.),pie 指令還有一特異功能,可將某個或數個扇形圖向外拖出,以強調部份資料。範例5-10:pie03.mx = 2 3 5 4;explode = 1 1 0 0;pie(x, explode);,Fig. 5-10,
6、其中指令 explode 中非零的 元素即代表要向外拖出的扇形。,5-3 扇形圖之繪製(cont.),欲畫出立體扇形圖,可用 pie3 指令。範例5-11 : pie301.mx = 2 3 5 4;explode = 1 1 0 0;label = 春,夏,秋,冬;pie3(x, explode, label);,Fig. 5-11,5-4 針頭圖之繪製,顧名思義,針頭圖(Stem Plots)就是以一個大頭針來表示某一點資料,其指令為 stem。範例5-12:stem01.mt = 0:0.2:4*pi;y = cos(t).*exp(-t/5);stem(t, y),Fig. 5-12,
7、5-4 針頭圖之繪製(cont.),針頭圖特別適用於表示數位訊號處理(DSP,Digital Signal Processing)中的數位訊號。若要畫出實心的針頭圖,可加“fill”選項。範例5-13:stem02.mt = 0:0.2:4*pi;y = cos(t).*exp(-t/5);stem(t, y, fill);,Fig. 5-13,5-4 針頭圖之繪製(cont.),欲畫出立體的針頭圖,可用 stem3 指令。範例5-14:stem301.mtheta = -pi:0.05:pi;x = cos(theta);y = sin(theta);z = abs(cos(3*theta)
8、.*exp(-abs(theta/3);stem3(x, y, z);,Fig. 5-14,5-5 階梯圖之繪製,使用 stairs 指令,可畫出階梯圖(Stairstep Plots),其精神和針頭圖很相近,只是將目前資料點的高度向右水平畫至下一點為止。(在數位訊號處理,此種作法稱為 Zero-order Hold。)範例5-15:stairs01.mt = 0:0.4:4*pi;y = cos(t).*exp(-t/5);stairs(t, y);,Fig. 5-15,5-5 階梯圖之繪製(cont.),若再加上針頭圖,則可見兩者相似之處。範例5-16:stairs02.mt = 0:0.
9、4:4*pi;y = cos(t).*exp(-t/5);stairs(t, y);hold on % 保留舊圖形stem(t, y); % 疊上針頭圖hold off,Fig. 5-16,5-6 實心圖之繪製,MATLAB 指令 fill 將資料點視為多邊形頂點,並將此多邊形塗上顏色,呈現出實心圖(Filled Plots)的結果。 範例5-17 : fill01.mt = 0:0.4:4*pi;y = sin(t).*exp(-t/5);fill(t, y, b); % b為藍色,Fig. 5-17,5-6 實心圖之繪製(cont.),若與 stem 合用,則可創造出一些不同的視覺效果。範
10、例5-18 : fill02.mt = 0:0.4:4*pi;y = sin(t).*exp(-t/5);fill(t, y, y); % y 為黃色hold on % 保留舊圖形stem(t, y, b); % 疊上藍色針頭圖hold off,Fig. 5-18,5-6 實心圖之繪製(cont.),fill3 可用於三維的實心圖。範例5-19: fill301.mX = 0 0 1 1;Y = 0 1 1 0;Z = 0 1 1 0;C = 0 0.3 0.6 0.9;fill3(X, Y, Z, C);,Fig. 5-19,5-6 實心圖之繪製(cont.),使用 fill3 指令,我們亦
11、可以畫出各種酷酷的圖形。範例5-20 : fill302.mt = (1/16:1/8:1)*2*pi;x = sin(t);y = cos(t);c = linspace(0, 1, length(t);fill3(x, y/sqrt(2), y/sqrt(2), c, x/sqrt(2), y, x/sqrt(2), c);axis tight,Fig. 5-20,5-7 向量場圖之繪製,使用 quiver 指令可畫出平面上的向量場圖(Quiver Plots),特別適用於表示分布於平面的向量場 (Vector Fields),例如平面上的電場分布,或是流速分布 。範例5-21:quive
12、r01.mx, y, z = peaks(20);u, v = gradient(z);contour(x, y, z, 10);hold on, quiver(x,y,u,v); hold offaxis image,Fig. 5-21,5-7 向量場圖之繪製(cont.),欲畫出空間中的向量場圖,可用 quiver3 指令。範例5-22:quiver301.mx, y = meshgrid(-2:0.2:2, -1:0.1:1);z = x.*exp(-x.2-y.2);u, v, w = surfnorm(x, y, z);quiver3(x, y, z, u, v, w);hold o
13、n, surf(x, y, z); hold offaxis equal,Fig. 5-22,5-8 等高線圖之繪製,我們可用 contour 指令來畫出等高線圖(Contour Plots)。範例5-23:contour01.mz = peaks;contour(z, 30); % 畫出 30 條等高線,Fig. 5-23,5-8 等高線圖之繪製(cont.),若要畫出特定高度的等高線,可執行如下:範例5-24:contour02.mz = peaks;contour(z, 0 2 5);,Fig. 5-24,5-8 等高線圖之繪製(cont.),欲標明等高線的高度,可用 clabel 指令
14、。範例5-25:contour03.mz = peaks;c,handle = contour(z, 10);clabel(c, handle);,Fig. 5-25,5-8 等高線圖之繪製(cont.),若欲在等高線之間填入顏色,可用 contourf 指令。範例5-26:contour04.mz = peaks;contourf(z);,Fig. 5-26,5-8 等高線圖之繪製(cont.),若要使畫出的等高線對應至正確的 x 及 y 座標,則可執行如下:範例5-27:contour05.mx,y,z = peaks;contour(x, y, z); % 使用三個輸入,Fig. 5-2
15、7,5-8 等高線圖之繪製(cont.),contourf 亦可接受 x、y、z 輸入引數。若要將等高線畫在曲面的正下方,可用 surfc 或 meshc 指令。範例5-28:contour06.mx, y, z = peaks; meshc(x, y, z);axis tight,Fig. 5-28,5-8 等高線圖之繪製(cont.),若要畫出三度空間中的等高線,可用 contour3 指令。範例5-29:contour301.mx, y, z = peaks;contour3(x, y, z, 30);axis tigh,Fig. 5-29,5-8 等高線圖之繪製(cont.),使用 c
16、ontour 指令亦可畫出極座標中的等高線,但過程較為複雜,以下列複數函數為例:其中 z 代表複數平面中的任一點複數,如果我們要畫出此函數的等高線,可見下列範例:範例5-30:contour07.mt = linspace(0, 2*pi, 61); % 角度的格子點r = 0:0.05:1; % 長度的格子點tt, rr = meshgrid(t, r); % 產生二維的格子點xx, yy = pol2cart(tt, rr); % 將極座標轉換至直角座標zz = xx + sqrt(-1)*yy; % 複數表示ff = abs(zz.3-1); % 曲面的函數contour(xx, yy,
17、 ff, 50); % 畫出等高線axis image,5-8 等高線圖之繪製(cont.),Fig. 5-30,5-8 等高線圖之繪製(cont.),在上例中,座標的標示仍為直角座標。欲將等高線顯示於極座標上,需先用 polar 指令產生一個極座標圖,再移除圖形,留下圖軸,然後再進行作圖。範例5-31:contour08.mh = polar(0 2*pi, 0 1); delete(h); hold oncontour(x, y, abs(f), 30);hold off,% 產生在極座標上的一條直線 % 移除上述圖形,但留下極座標圖軸,Fig. 5-31,要注意的是,你必須先執行 con
18、tour07.m,然後再執行 contour08.m,才能得到上述的及座標等高線的效果。,5-8 等高線圖之繪製(cont.),我們也可以同時畫出複數函數的曲面和等高線圖,例如,下列範例可以畫出複數函數:範例5-32:contour09.mt = linspace(0, 2*pi, 61); % 角度的格子點r = 0:0.05:1; % 長度的格子點tt, rr = meshgrid(t, r); % 產生二維的格子點xx, yy = pol2cart(tt, rr); % 將極座標轉換至直角座標zz = xx + sqrt(-1)*yy; % 複數表示ff = abs(zz.3-1); %
19、 曲面的函數值h = polar(0 2*pi, 0 1); % 產生在極座標上的一條直線delete(h); % 移除上述圖形,但留下極座標圖軸hold oncontour(xx, yy, ff, 20); % 等高線surf(xx, yy, ff); % 曲面圖hold offview(-19, 22); % 設定觀測角度,5-8 等高線圖之繪製(cont.),Fig. 5-32,5-8 等高線圖之繪製(cont.),特殊繪圖函數:,5-9 其他進階繪圖功能,MATLAB 在 5.3 版後,開始支援容積目視法(Volume Visualization)、因此能夠畫出在三度空間中的流線圖、向量場圖、等高面圖(Isosurfaces)、切面圖(Slices)等,相關指令可列表如下頁:,5-9 其他進階繪圖功能(cont.), MATLAB 有關於容積目視法的指令:,5-9 其他進階繪圖功能(cont.), MATLAB 有關於容積目視法的指令:,5-9 其他進階繪圖功能(cont.),這些指令的用法較為繁複,由於篇幅有限,在此不詳細說明,讀者可查閱相關的線上支援。若要一睹這些容積目視指令所能創造的繽紛效果,您可在 MATLAB 指令視窗下輸入volvec,以開啟展示視窗,在點選Multiple之後,產生圖形如右:,