跳轉到

Matplotlib

Matplotlib 是 Python 裡最常用的「資料視覺化」套件。

如果 Pandas 像是可以用程式控制的 Excel,Matplotlib 就像是可以用程式控制的圖表工具。

  • Excel:選資料、插入圖表、調整標題、調整顏色。
  • Matplotlib:用 Python 指令把資料畫成折線圖、長條圖、直方圖、散佈圖、圓餅圖,並且可以自動輸出圖片。

Matplotlib 的核心價值不是「畫漂亮的圖」而已,而是把一堆數字變成別人看得懂的訊息。

為什麼職場會需要圖表?

職場裡很多事情不是只有「知道答案」,還要「讓別人相信你看到的重點」。

假設你在公司做資料助理、行政助理、電商助理、行銷助理、門市管理、客服主管,常見任務可能是:

  • 每週整理銷售量。
  • 每月整理客訴原因。
  • 比較不同商品銷售表現。
  • 分析履歷投遞與面試結果。
  • 製作主管要看的簡報圖片。
  • 自動輸出固定格式的報表。

只丟一張 CSV 給主管,主管通常不想看。

如果你可以把資料整理成圖:

  • 哪裡變好,一眼看出來。
  • 哪裡變差,一眼看出來。
  • 哪個項目最重要,一眼看出來。

這就是資料視覺化的價值。

pyplot 是什麼?

Matplotlib 很常這樣匯入:

import matplotlib.pyplot as plt

可以把 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 筆,內容是職訓班常見情境:

欄位 說明
日期 紀錄日期
週次 第幾週
學員姓名 學員代稱
班別 參訓班別
學習時數 當天學習時數
練習題數 當天練習題數
作業分數 作業成績
投遞履歷數 當天投遞履歷數
面試邀約數 當天收到面試邀約數
求職目標 想找的工作
期待薪資 期待月薪
通勤分鐘 預估通勤時間
飲料類別 茶類、咖啡、奶茶、果茶
飲料名稱 常點飲料
飲料杯數 當天購買杯數
城市 居住或活動城市
心情狀態 當天學習心情

折線圖

折線圖適合看「時間變化」。例如:

長條圖

長條圖適合比較「不同類別誰比較多」。例如:

  • 哪位學員投最多履歷?
  • 哪個商品賣最多?
  • 哪個縣市訂單最多?
  • 哪個課程報名最多人?

長條圖的重點是「比較高低」。柱子越高,數字越大。人類眼睛很擅長比較長度,所以長條圖很適合排名。

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 群組、報告或主管簡報。
# 這就是自動化報表的雛形:讀資料、整理資料、畫圖、存檔。

練習題目