---
# System prepended metadata

title: 資研 5/24 上課講義
tags: [社課講義, 資研]

---

# 資研 5/24 上課講義

[**提問表單**](https://forms.gle/z4dPC1JPV6uA2q9w7)

---

## Matplotlib

[**官方資料**](https://matplotlib.org/stable/index.html)

### 上堂課

:::info
**練習**

請大家畫一個 $f1: y = (x-\frac{1}{5})^2 + 2$ 和一個 $f2: y = -x^3 + 2$ 的圖形，條件如下：
1. 圖的大小是 $8 * 8$
2. 標題是 **二次函數** 字體大小為 15
4. x是在-2~2之間平均取20個點（上次有教）
5. 要畫線+描點
6. f1的顏色為 #005AB5 ；f2的顏色為 #3D7878
7. 要有圖例標示
8. 其餘的自訂

```python=
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.font_manager as plt_font
twfont1 = plt_font.FontProperties(fname = '字型路徑')

# 定義出指定函式
def f1(x):
  return (x-0.2)**2+2

def f2(x):
  return -x**3+2

# 設定座標點
x_point = np.linspace(-2, 2, 20)
y_point1 = f1(x_point)
y_point2 = f2(x_point)

# 定義圖片大小、標題
plt.figure(figsize = (8, 8))
plt.title("二次函數", fontproperties = twfont1, fontsize = 15)
plt.xlabel("x軸", fontproperties = twfont1, fontsize = 8)
plt.ylabel("y軸", fontproperties = twfont1, fontsize = 8)

# 畫出來
plt.plot(x_point, y_point1, c = "#005AB5", linewidth = 2, marker='o', ms = 5, label = "f1")
plt.plot(x_point, y_point2, linestyle = "dotted", c = "#3D7878", linewidth = 2, marker='s', ms = 5, label = "f2")
plt.legend(prop = twfont1)
```

範例：

>不一定會一模一樣

![image](https://hackmd.io/_uploads/B1ut5SWMR.png)

:::

### 散佈圖 Scatter

```python=
import numpy as np
import random as rd
import matplotlib.pyplot as plt
import matplotlib.font_manager as plt_font
twfont1 = plt_font.FontProperties(fname = '字型檔案')

plt.figure(figsize = (5, 5))
plt.title("散佈圖", fontproperties = twfont1, fontsize = 20)

x_point = np.array([5,7,8,7,2,17,2,9,4,11,12,9,6])
y_point = np.array([99,86,87,88,111,86,103,87,94,78,77,85,86])

# 散佈圖用scatter
plt.scatter(x_point, y_point, c = "#7373B9")
# 沒有圖例，用plt.show()
plt.show()
```

![image](https://hackmd.io/_uploads/r1POz8-GC.png)

:::warning
**顏色可以用漸層的**
[cmps](https://matplotlib.org/stable/users/explain/colors/colormaps.html)

```python=
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.font_manager as plt_font
twfont1 = plt_font.FontProperties(fname = '字型檔案')

plt.figure(figsize = (5, 5))
plt.title("散佈圖", fontproperties = twfont1, fontsize = 20)

x_point = np.array([5,7,8,7,2,17,2,9,4,11,12,9,6])
y_point = np.array([99,86,87,88,111,86,103,87,94,78,77,85,86])
colors = np.linspace(0, 100, 13)

plt.scatter(x_point, y_point, c = colors, cmap = "Blues")
# 顯示colorbar
plt.colorbar()
plt.show()
```

![image](https://hackmd.io/_uploads/Sy9hGIZfC.png)
:::

### 長條圖 Bars

```python=
import numpy as np
import random as rd
import matplotlib.pyplot as plt
import matplotlib.font_manager as plt_font
twfont1 = plt_font.FontProperties(fname = '/content/drive/MyDrive/資研/資料/msjh.ttc')

plt.figure(figsize = (10, 5))
plt.title("長條圖", fontproperties = twfont1, fontsize = 20)
plt.xlabel("座號", fontproperties = twfont1, fontsize = 10)
plt.ylabel("作業完成度", fontproperties = twfont1, fontsize = 10)

# 取得 array = 1~38
x_point = np.arange(1, 39)
# 取得 array = 1~100
Y = list(np.arange(1, 101))
# 隨機取 38個1~100之間 的數字做為 1~38號的完成狀況
y_point = rd.sample(Y, 38)

# 長條圖用bar
plt.bar(x_point, y_point)
plt.show()
```

![image](https://hackmd.io/_uploads/rJosHIZfC.png)

:::info
**練習**

請利用以下資料，先將作業完成度轉換成完成百分比，並畫出長條圖

```
座號    完成的作業數量（共17項）
1	16
2	13
3	4
4	12
5	11
6	15
7	3
8	12
9	12
10	7
11	8
12	6
13	7
14	15
15	1
16	17
17	10
18	17
19	14
20	13
```

```python=
import numpy as np
import random as rd
import matplotlib.pyplot as plt
import matplotlib.font_manager as plt_font
twfont1 = plt_font.FontProperties(fname = '字型路徑')

plt.figure(figsize = (10, 5))
plt.title("長條圖", fontproperties = twfont1, fontsize = 20)
plt.xlabel("座號", fontproperties = twfont1, fontsize = 10)
plt.ylabel("作業完成度%", fontproperties = twfont1, fontsize = 10)

x_point = np.arange(1, 21)
y = np.array([16, 13, 4, 12, 11, 15, 3, 12, 12, 7, 8, 6, 7, 15, 1, 17, 10, 17, 14, 13])
y_point = y/17*100

# 長條圖用bar
plt.bar(x_point, y_point)
plt.show()
```

範例

![image](https://hackmd.io/_uploads/BkRXVWTQR.png)

:::

### 直方圖 Histograms

```python=
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.font_manager as plt_font
twfont1 = plt_font.FontProperties(fname = '字型檔案')

plt.figure(figsize = (10, 5))
plt.title("長方圖", fontproperties = twfont1, fontsize = 20)

D = list(np.arange(0, 100))
data = rd.sample(D, 20)

# 直方圖用plt.hist()，bins = "auto"會自動決定組距
plt.hist(data, bins = 'auto')
plt.show()
```

![image](https://hackmd.io/_uploads/r1aawIWz0.png)

### 圓餅圖 Pie Charts

```python=
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.font_manager as plt_font
twfont1 = plt_font.FontProperties(fname = '字型檔案')

plt.figure(figsize = (10, 5))
plt.title("圓餅圖", fontproperties = twfont1, fontsize = 20)

data = np.array([35, 25, 25, 15])
# 設定各項數據名稱
L = ["freshman", "sophomore", "junior", "senior"]
# 設定圓餅突出的距離
E = [0, 0.2, 0, 0]
# 設定顏色
C = ["#C4E1FF", "#66B3FF", "#2894FF", "#004B97"]

# 圓餅圖用plt.pie()，labels圖例，explode突出，colors顏色，shadow陰影
plt.pie(data, labels = L, explode = E, colors = C, shadow = True)
# title標題，loc圖例位置
plt.legend(prop = twfont1, title = "Students", loc = "upper left")
```

![image](https://hackmd.io/_uploads/SkpV3UWzR.png)