Python 自動出圖表:數據一更新,圖表自動重新出(matplotlib 入門)

每個月出報表,最煩嗰步通常唔係計數,而係「畫圖」。數字喺 Excel 計好晒,但仲要逐個部門開新 sheet、插圖表、執顏色、改標題,再 copy 去 PowerPoint 或者貼上 Facebook。一套做完,成個下晝就冇咗。

更麻煩係下個月數據一改,所有圖又要由頭再做一次。今次講嘅方法,係用 Python 嘅 matplotlib,將「讀數據、出圖、存檔」寫成一個 script。以後每月只需要換一個 Excel 檔,行一次,所有圖自動重新出好,檔名同尺寸都整整齊齊。

第一步:安裝三個庫

開「命令提示字元」,打以下指令:

pip install matplotlib pandas openpyxl

三個庫各有分工:pandas 負責讀 Excel、matplotlib 負責畫圖、openpyxl 係 pandas 讀 .xlsx 嘅後台引擎,冇佢會報錯。

第二步:先解決中文變豆腐

第一次用 matplotlib 出中文標題,好大機會見到一堆「□□□」。原因係它預設字型冇中文字。加幾行設定就搞掂:

import matplotlib matplotlib.rcParams["font.sans-serif"] = ["Microsoft JhengHei"] matplotlib.rcParams["axes.unicode_minus"] = False

第二行係為咗負數個「−」號唔會變豆腐。用 Mac 機嘅話,字型名改成 "PingFang HK"。

第三步:由 Excel 讀數,出一張走勢圖

假設你有個 sales.xlsx,入面兩欄:月份、營業額。開一個新檔案 make_charts.py,貼入以下 code:

import pandas as pd import matplotlib matplotlib.use("Agg") import matplotlib.pyplot as plt df = pd.read_excel("sales.xlsx") plt.figure(figsize=(10, 5), dpi=150) plt.plot(df["月份"], df["營業額"], marker="o", linewidth=3, color="#F97316") plt.title("每月營業額走勢", fontsize=18) plt.xlabel("月份") plt.ylabel("營業額(HK$)") plt.grid(axis="y", linestyle="--", alpha=0.4) plt.tight_layout() plt.savefig("chart_trend.png") plt.close() print("已輸出 chart_trend.png")

逐行解釋

  • matplotlib.use("Agg") —— 用「唔開視窗」模式畫圖。放喺定時任務或者冇螢幕嘅電腦行都唔會卡死。
  • figsize=(10, 5) —— 圖嘅比例,闊 10 吋、高 5 吋;配 dpi=150 大約 1500×750 像素,放網頁同簡報都夠清。
  • marker="o" —— 每個數據點加個圓點,讀者一眼睇到實際數字喺邊,唔使靠估線嘅位置。
  • linewidth=3 —— 線加粗。投影機或者手機睇,幼線會消失。
  • tight_layout() —— 自動收邊,避免標題或者座標軸標籤被切走。
  • plt.savefig() —— 存成 PNG。要 SVG 就改做 chart_trend.svg,放大都唔會起格。

第四步:一條 for loop,出齊所有部門嘅圖

真正省時間嘅位喺呢度。與其開十次 Excel、插十次圖,不如用一個迴圈,每個部門出一張,檔名自動帶部門名:

for dept in df.columns[1:]: plt.figure(figsize=(10, 5), dpi=150) plt.bar(df["月份"], df[dept], color="#F97316", edgecolor="#1F2937", linewidth=1.2) plt.title(f"{dept} 每月營業額", fontsize=18) plt.ylabel("營業額(HK$)") plt.grid(axis="y", linestyle="--", alpha=0.4) plt.tight_layout() plt.savefig(f"chart_{dept}.png") plt.close() print("全部圖表已輸出")

關鍵係 plt.close():每一次畫完都要關掉。唔關嘅話,迴圈開幾十張圖會一路食記憶體,跑到第十幾張就爆。

揀錯圖表類型,訊息會走晒樣

同一個數據,用錯圖種,讀者就會得出錯結論。四個基本配對:

  • 睇走勢 → 折線圖 plt.plot。連續時間序列,例如每月營業額、每日網站訪客。
  • 比大小 → 柱狀圖 plt.bar。幾間分店、幾個部門之間比較,一眼睇出邊個最高。
  • 睇佔比 → 圓餅圖 plt.pie。而且只限五個或以下分類;超過就變一堆碎色塊,冇人睇得明。
  • 睇關係 → 散點圖 plt.scatter。例如廣告費同查詢量有冇一齊升。

另外一個常見錯誤:縱軸唔由零開始。與其靠視覺效果「放大」差距,不如老實由零起,睇落差距細就係差距細。

實際慳幾多時間

一個月十張圖,人手做每張大約 5 至 8 分鐘 —— 開檔、插圖表、執色、改標題、存檔 —— 合共一個鐘左右。寫好 script 之後,每月只需換 Excel、行一次,大約 15 秒全部出齊,而且格式完全一致,唔會有一張字大啲、一張色唔同。

更值錢嘅係唔會漏。人手做十次,總有一兩次貼錯月份、或者漏咗某間分店。寫成 script 之後,只要數據源正確,出嚟嘅圖就一次都唔會漏,出事嘅位只剩返「Excel 本身填錯」呢一種。

總結

Python 教學:出圖表唔需要開 Excel 逐張插,用 matplotlib 將「讀數、畫圖、存檔」寫成一個 script,之後每月換個 Excel 檔行一次,十幾秒就出齊所有圖,格式統一、零遺漏。開始嘅時候唔好貪心,先用一張圖試通,確認中文字型同尺寸啱心水,再加迴圈批次出圖。