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

官方查核:matplotlib.pyplot.subplots · matplotlib.axes.Axes.plot