Matplotlib¶
Matplotlib 是 Python 裡最常用的「資料視覺化」套件。
如果 Pandas 像是可以用程式控制的 Excel,Matplotlib 就像是可以用程式控制的圖表工具。
- Excel:選資料、插入圖表、調整標題、調整顏色。
- Matplotlib:用 Python 指令把資料畫成折線圖、長條圖、直方圖、散佈圖、圓餅圖,並且可以自動輸出圖片。
Matplotlib 的核心價值不是「畫漂亮的圖」而已,而是把一堆數字變成別人看得懂的訊息。
為什麼職場會需要圖表?¶
職場裡很多事情不是只有「知道答案」,還要「讓別人相信你看到的重點」。
假設你在公司做資料助理、行政助理、電商助理、行銷助理、門市管理、客服主管,常見任務可能是:
- 每週整理銷售量。
- 每月整理客訴原因。
- 比較不同商品銷售表現。
- 分析履歷投遞與面試結果。
- 製作主管要看的簡報圖片。
- 自動輸出固定格式的報表。
只丟一張 CSV 給主管,主管通常不想看。
如果你可以把資料整理成圖:
- 哪裡變好,一眼看出來。
- 哪裡變差,一眼看出來。
- 哪個項目最重要,一眼看出來。
這就是資料視覺化的價值。
pyplot 是什麼?¶
Matplotlib 很常這樣匯入:
可以把 pyplot 想成「畫圖用的遙控器」。
你按不同按鈕,它就做不同事情:
| 指令 | 白話理解 |
|---|---|
plt.figure() |
準備一張新的畫布 |
plt.plot() |
畫折線圖 |
plt.bar() |
畫長條圖 |
plt.hist() |
畫直方圖 |
plt.scatter() |
畫散佈圖 |
plt.pie() |
畫圓餅圖 |
plt.title() |
加標題 |
plt.xlabel() |
設定 x 軸名稱 |
plt.ylabel() |
設定 y 軸名稱 |
plt.grid() |
加格線 |
plt.show() |
把圖顯示出來 |
plt.savefig() |
把圖存成圖片 |
最基本流程通常是:
import matplotlib.pyplot as plt
plt.figure(figsize=(8, 5))
plt.plot([1, 2, 3], [60, 75, 90])
plt.title("成績變化")
plt.xlabel("週次")
plt.ylabel("分數")
plt.show()
可以用高中程度這樣解釋:
x軸像地圖的左右方向。y軸像地圖的上下方向。- 一個點就是一組座標,例如
(第 1 週, 60 分)。 - 折線圖就是把很多點依照順序連起來。
- 連起來之後,人類眼睛就很容易看出「上升、下降、持平」。
中文字型問題¶
Matplotlib 預設環境不一定知道怎麼顯示中文,所以有時候圖表會出現方框。
電腦不是看得懂「中文」才顯示中文,而是要找到支援中文字的字型檔。Matplotlib 如果找不到中文字型,就像你拿到一本沒有中文字模的印章簿,蓋出來就會變成方框。
import matplotlib.pyplot as plt
plt.rcParams["font.family"] = "Microsoft JhengHei" # 設定中文字型
plt.rcParams["axes.unicode_minus"] = False # 解決負號無法正常顯示
教材資料集¶
資料共有 70 筆,內容是職訓班常見情境:
| 欄位 | 說明 |
|---|---|
| 日期 | 紀錄日期 |
| 週次 | 第幾週 |
| 學員姓名 | 學員代稱 |
| 班別 | 參訓班別 |
| 學習時數 | 當天學習時數 |
| 練習題數 | 當天練習題數 |
| 作業分數 | 作業成績 |
| 投遞履歷數 | 當天投遞履歷數 |
| 面試邀約數 | 當天收到面試邀約數 |
| 求職目標 | 想找的工作 |
| 期待薪資 | 期待月薪 |
| 通勤分鐘 | 預估通勤時間 |
| 飲料類別 | 茶類、咖啡、奶茶、果茶 |
| 飲料名稱 | 常點飲料 |
| 飲料杯數 | 當天購買杯數 |
| 城市 | 居住或活動城市 |
| 心情狀態 | 當天學習心情 |
折線圖¶
折線圖適合看「時間變化」。例如:
- 每週學習時數
- 每月收入
- 每天飲料銷量
- 每週體重
-
每月網站流量
- 範例:折線圖_班上每日飲料杯數變化.py(真實工作通常不是自己手打 list,而是讀 CSV)。
長條圖¶
長條圖適合比較「不同類別誰比較多」。例如:
- 哪位學員投最多履歷?
- 哪個商品賣最多?
- 哪個縣市訂單最多?
- 哪個課程報名最多人?
長條圖的重點是「比較高低」。柱子越高,數字越大。人類眼睛很擅長比較長度,所以長條圖很適合排名。
sort_values(ascending=False) 的意思是由大到小排序,讓最多的排前面。
直方圖¶
直方圖和長條圖長得像,但用途不同。
| 圖表 | 適合問題 |
|---|---|
| 長條圖 | 比較不同類別,例如小安、小婷、阿哲誰投最多 |
| 直方圖 | 看一批數字集中在哪裡,例如薪資大多落在哪個區間 |
散佈圖¶
散佈圖適合看「兩個數字之間有沒有關係」。例如:
- 學習時數越多,作業分數會越高嗎?
- 通勤越久,期待薪資會越高嗎?
- 投遞履歷越多,面試邀約會越多嗎?
-
廣告預算越高,訂單數會越高嗎?
圓餅圖¶
圓餅圖適合看「比例」。例如:
- 飲料類別占比
- 客訴原因占比
- 商品分類銷售占比
-
學員求職方向占比
多子圖儀表板¶
有時候一張圖不夠,因為我們想同時看多個角度。例如職訓班老師可能想看:
- 每週平均學習時數
- 每週平均作業分數
- 每週總投遞履歷數
- 每週總面試邀約數
核心寫法:
plt.subplots(2, 2) 就像把一張 A4 紙切成 2 列 2 欄,總共有 4 個小區塊,每個區塊都可以放一張圖。
┌─────────────┬─────────────┐
│ axes[0, 0] │ axes[0, 1] │
├─────────────┼─────────────┤
│ axes[1, 0] │ axes[1, 1] │
└─────────────┴─────────────┘
輸出圖片與報表¶
上課畫圖通常用 plt.show(),工作上更常需要把圖存下來。
# 核心寫法:
plt.savefig(output_dir / "各學員平均作業分數.png", dpi=150)
# `summary.to_csv()` 可以把整理後的表格輸出。
# `plt.savefig()` 可以把圖表輸出。
# `plt.show()` 是把圖拿到螢幕上看。`plt.savefig()` 是把圖存成圖片檔,之後可以放進 Word、PowerPoint、LINE 群組、報告或主管簡報。
# 這就是自動化報表的雛形:讀資料、整理資料、畫圖、存檔。