# CH08 二維圖形 ## 課程重點 ### 基本繪圖: ```matlab plot(x陣列,y陣列) plot(x1,y1,x2,y2) %也可以同時畫兩條 ``` ### 繪圖選項 `'LineSpec'` : 改變線條內容的字串 顏色:Color |顏色|紅|綠|藍| |---|---|---|---| |符號|r|g|b 線條形狀:LineStyle |形狀|實線|虛線|點線| |---|---|---|---| |符號|-|-\-|: 標記:Marker |圖案|圓點|星號|叉號| |---|---|---|---| |符號|o|\*|x 屬性:(PropertyName, PropertyValue) |指令|'LineWidth'|'MarkerSize'|'MarkerFaceColor'| |---|---|---|---| |說明|改變線寬|改變標記大小|改變標記顏色 範例 綠色+星號標記+點線+寬度為二的線: ```matlab! plot(x,y,'g*:','LineWidth',2) ``` ### 多重繪圖/相關指令 - hold on 如有多個plot指令的情況下,matlab只會顯示出最後的那一個圖形。 若想要同時繪製多個圖形,就必須使用hold on: 若要結束重疊,就用hold off ```matlab plot(x1,y1) hold on plot(x2,y2) hold off ``` - legend('圖表名稱') legend可以用於套用圖例在圖表上: 若要關閉,用legend off ```matlab! legend('圖表一','圖表二') ``` - subplot(列,行,順位) subplot可以在同一視窗中顯示多個圖表 ```matlab! subplot(2,2,1) %第一格 plot(x1,y1) subplot(2,2,2) %第二格 plot(x2,y2) subplot(2,2,3) %第三格 plot(x3,y3) subplot(2,2,4) %第四格 plot(x4,y4) ``` - figure(視窗) figure用來控制圖表顯示在第幾個視窗 ```matlab! figure(1) %第一個視窗 plot(x1,y1) figure(2) %第二個視窗 plot(x2,y2) ``` ### 特殊繪圖 有關對數刻度的繪圖: ```matlab! semilogx(x, y) % x 軸採對數刻度,y 軸採線性刻度 semilogy(x, y) % y 軸採對數刻度,x 軸採線性刻度 loglog(x, y) % x 軸與 y 軸皆採對數刻度 ``` ```matlab! plotyy(x1,y1,x2,y2) %在同一張圖上繪製兩條曲線,同時使用左y軸與右y軸 ``` ### 簡易繪圖 ezplot可以用來做簡單的繪圖 只要將函數以字串的形式放入即可 也可以指定x,y範圍: ```matlab! ezplot('sin(x)') ezplot('sin(x)',[-10,10,-2,2]) % x=-10~10,y=-2~2 ``` 也可以用ezplot來繪出簡單幾何圖形 ```matlab! ezplot('(x-0)^2+(y-0)^2-25',[-5,5]) %半徑為五的圓形 ``` ## 程式練習 ### `plotSinc.m` 利用plot語法繪製函數 𝑦=𝑠𝑖𝑛(𝑥)𝑥,−15≤𝑥≤15 ```matlab= x = -15:0.1:15 plot(x,sin(x)./x) ``` ![image](https://hackmd.io/_uploads/SyEO8R89gl.png =300x) ### `parabola.m` 已知一物體以初速度70𝑚/𝑠,仰角 60拋出,重力加速度為10𝑚/𝑠^2,利用plot語法繪製其拋物線,並顯示標題、格線、標註x與y座標。 ```matlab= % 0 = 70*sind(60).*t - 10/2.*t.^2 % t = 14*sind(60) t = 0:0.1:14*sind(60); x = 70*cosd(60).*t; y = 70*sind(60).*t - 5.*t.*t; plot(x,y); grid on title('初速度 70𝑚/𝑠,仰角60度') xlabel('水平距離x(m)') ylabel('高度y(m)') ``` ![image](https://hackmd.io/_uploads/BJkwURUqxe.png =300x) ### `axisTest.m` 繪製函數 𝑦=𝑐𝑜𝑠(𝑥)∗𝑥,−15≤𝑥≤15,顯示標題、格線、標註x與y座標,並限制顯示範圍如下圖。 ```matlab= x = -15:0.1:15; plot(x,cos(x).*x); title('cos(x)*x'); xlabel('x'); ylabel('y'); grid on; axis([-20 20 -15 15]); ``` ![image](https://hackmd.io/_uploads/HJLG1CU9ge.png =400x) ### `subParabola.m` 以第二題為基礎,繪製物體以初速度70𝑚/𝑠,重力加速為10𝑚/𝑠^2,仰角分別為0、10、20、…、90拋出的結果,利用subplot語法繪製子圖,並顯示標題、格線、標註x與y座標。 補充:num2str()可將括號內數字轉為字串。 ```matlab= clf for i=0:9 ang = i*10 t = 0:0.1:14*sind(ang); x = 70*cosd(ang).*t; y = 70*sind(ang).*t - 5.*t.^2; subplot(5, 2, i+1); plot(x,y); title(num2str(ang)); xlabel('水平距離'); ylabel('高度'); hold on end hold off; ``` ![image](https://hackmd.io/_uploads/HkzTQA8cgx.png =300x) ### `earthquake.m` 常用地震大小的震度為芮氏規模,其與能量的關係為𝑙𝑜𝑔10(𝐸)=1.5𝑀+4.8,E為釋放能量 (焦耳),M為芮氏地震規模,利用此等式與semilogy繪製能量與規模的關係圖。 ```matlab= %log_{10}(E)=1.5M+4.8 x = 0:9 semilogy(x,10.^(1.5*x + 4.8)) title('芮氏地震規模與能量的關係') xlabel('芮氏地震規模M'); ylabel('釋放能量E(焦耳,J)'); ``` ![image](https://hackmd.io/_uploads/H1Sc3nwqex.png =300x) ### `oval.m` 參考圓形的範例程式,繪製圓心在原點,𝑎=8、𝑏=6的橢圓,顯示範圍 -10<=x, y<=10。 ```matlab= % 橢圓 ((x-xc).^2)./a^2 + ((y-yc).^2)./b^2 = 1 % (x^2)/64 + (y^2)/36 = 1 % y = ((1-(x^2)/64)*36)^1/2 clf a = 8; b = 6; xc = 0; % 圓心x yc = 0; % 圓心y checkno = 0; for x = -10:0.05:10 if ((1-(x.^2)./a^2).*36).^1/2 >= 0 %y>=0 y1 = yc + sqrt(((1-(x.^2)./a^2).*b^2)); y2 = yc - sqrt(((1-(x.^2)./a^2).*b^2)); if checkno == 0 % 第一點 plot(x, y1, x, y2); checkno = 1; else % 其餘點 : 連線 X = [x, xx]; Y1 = [y1, yy1]; line(X, Y1); Y2 = [y2, yy2]; line(X, Y2); end xx = x; % 前一點座標 設定 yy1 = y1; yy2 = y2; hold on; end end xlabel('x'); ylabel('y'); grid on; axis equal; axis([-10 10 -10 10]); ``` ![image](https://hackmd.io/_uploads/Hk20GaDclg.png =300x) ## 章節統整/心得 本章主要內容是透過不同的圖形函式來正確的表達圖形內容,每一個函式的表達方式並不會有太大的差異,通常而言更需要注意的是xy陣列是否宣告正確 解題遇到的問題: 初始條件難以訂定-在需要判斷斜拋運動的題目裡,需要依初始條件來定正確時間軸已取得正確的x,y陣列