---
# System prepended metadata

title: CH08 二維圖形

---

# 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陣列