TEMPEDU · MATPLOTLIB 實作課
01|從問題出發:建立第一張 Figure 與 Axes
你能依問題選圖,說出 Figure、Axes、Axis 的分工,並從完整資料建立一張有單位的折線圖。
預估 20 分鐘|先備:Python 串列、匯入與 pandas 基礎|每段示範和答案均可從乾淨環境單獨執行
01|情境任務
你是虛構「晨光學習工作室」的資料助理。團隊想比較兩種教學方案的 14 天觀測值,主管先問:「方案 A 的觀測值怎麼變?」這是按時間排列的趨勢問題。這裡的觀測單位只是教學設定,不能把它解讀成實際學習成效。
02|先把問題寫成一句話
畫圖前先指定誰、什麼數值、怎麼比較。每天觀測值的變化適合折線圖;各商品總數適合長條圖;兩個數值是否一起變動適合散佈圖;單一數值集中在哪裡適合直方圖。圖型不是裝飾,會決定讀者看到的關係。這堂只回答一個方案的時間變化,暫時不塞入所有資料。
03|檢查輸入,避免「能畫出來」就當成正確
範例用 pandas.DataFrame 建立 14 列、3 欄的表。day 是第幾天,plan_a 與 plan_b 是兩種方案的觀測值。先確認欄名、筆數、缺失值,再把同一列的 day 和 plan_a 配成一個點。x、y 長度相同只是必要條件;若兩欄各自排序,雖然長度相同,點的配對仍會錯。
04|把畫布和繪圖區分清楚
Figure 是整張畫布;Axes 是其中一個完整繪圖區,包含資料線、標題和兩個方向的座標軸;Axis 才是單一方向的刻度與尺度系統。plt.subplots() 回傳 fig 和 ax 兩個物件,不是兩張圖。pyplot 寫法會操作目前作用中的圖;本課保留 fig、ax,後面有多張圖時比較不容易畫錯位置。
05|依四個步驟完成最小範例
先準備資料,再建立 fig、ax,接著用 ax.plot(x, y) 加上資料線,最後設定文字並呼叫 plt.show()。plot 回傳 Line2D 物件組成的串列;只畫一條線時仍是串列,所以 line = lines[0]。figsize=(6, 3) 的單位是英吋。這個例子只在記憶體建圖並顯示,不會主動上傳或寫入雲端硬碟。
06|完整示範:先執行,再對照
本課使用教學合成資料。圖表為程式實際生成結果,沒有真實學生、客戶或營收資料,也不是操作錄影。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# 以下均為教學合成資料,並非真實成效或營收
daily = pd.DataFrame({
'day': np.arange(1, 15),
'plan_a': [22, 24, 23, 27, 29, 28, 31, 30, 33, 35, 34, 38, 37, 40],
'plan_b': [21, 22, 24, 24, 26, 27, 26, 29, 30, 29, 32, 33, 35, 34],
})
print('shape:', daily.shape)
assert daily.shape == (14, 3)
assert daily['day'].is_monotonic_increasing
assert daily[['day', 'plan_a']].notna().all().all()
fig, ax = plt.subplots(figsize=(6, 3), layout='constrained')
lines = ax.plot(daily['day'], daily['plan_a'], marker='o')
line = lines[0]
ax.set_title('Synthetic Plan A: 14-day observations')
ax.set_xlabel('Day')
ax.set_ylabel('Observation (units)')
assert ax.figure is fig
assert len(line.get_xdata()) == 14
print('axes:', len(fig.axes), '| points:', len(line.get_xdata()))
plt.show()
你應看見 14 個點,第一天為 22、最後一天為 40,中間仍有下降的日子。這只能描述合成序列,不代表「每天都進步」。讀圖時先看 x 軸的順序,再看 y 軸的單位,最後才看線條的形狀。
07|輪到你:實作任務
用三天的合成資料 day=[1,2,3]、value=[12,15,14] 建立一張 5×3 英吋的折線圖,加入圓點、Synthetic 標題及 Day/Observation (units) 軸標籤。印出點數,確認 fig 與 ax 的從屬關係。
先寫出兩個等長串列;先不要改顏色、圖例或刻度。用 len(line.get_xdata()) 檢查點數。
展開完整參考答案與說明
建議先自己完成。以下答案包含匯入與資料,不需要依賴上面的變數。
import matplotlib.pyplot as plt
day = [1, 2, 3]
value = [12, 15, 14] # 教學合成資料
assert len(day) == len(value)
fig, ax = plt.subplots(figsize=(5, 3), layout='constrained')
lines = ax.plot(day, value, marker='o')
line = lines[0]
ax.set(title='Synthetic three-day observations',
xlabel='Day', ylabel='Observation (units)')
assert ax.figure is fig
assert len(line.get_xdata()) == 3
assert list(line.get_ydata()) == [12, 15, 14]
print('points:', len(line.get_xdata()))
plt.show()
ax.plot 把資料加到指定繪圖區;ax.set 一次設定標題與軸標籤。你看到的是先升後降,不應寫成持續上升。assert 失敗時會立即指出資料或物件不符合條件,比只用肉眼看線條可靠。
08|完成標準與自我檢核
- 從乾淨執行環境整段執行成功,印出 points: 3
- 圖中恰有 3 個觀測點,兩軸有完整文字
- 能用自己的話分辨整張畫布與單一繪圖區
你能依問題選圖,說出 Figure、Axes、Axis 的分工,並從完整資料建立一張有單位的折線圖。
下一堂讓同一張圖能給不看程式碼的人閱讀。
教材對照:原投影片 1–7;原 Notebook 01–05、28