Python Matplotlib 資料視覺化入門教學:用圖表說故事的完整指南
Matplotlib 是什麼?為什麼你一定要學?
如果你已經會用 Python 做資料分析,卻發現每次報告都只能貼一堆數字表格,那你真的該認識 Matplotlib 了。Matplotlib 是 Python 生態系中最老牌、也最穩定的繪圖套件,從 2003 年誕生至今,幾乎所有 Python 資料視覺化的基礎都建立在它之上。
為什麼它這麼重要?因為人類是視覺動物。一張好的圖表,勝過一千行數據。不管你是做數據分析、機器學習還是寫報告給老闆看,Matplotlib 都是你的第一把武器。如果你還在學 Python Pandas 資料分析入門 的階段,那更要同步學 Matplotlib,因為 Pandas 的 plot 功能底層就是用 Matplotlib 實作的。
老實說,Matplotlib 的 API 設計確實有點「古老」,語法不算最直覺,但它的靈活度和社群資源是其他套件無法比擬的。學會它,等於打通了 Python 視覺化的任督二脈。
安裝 Matplotlib:三分鐘搞定環境
安裝 Matplotlib 非常簡單,只需要一行指令:
pip install matplotlib
如果你使用 Anaconda 環境,通常已經預裝好了。建議搭配 Python 虛擬環境教學 來建立獨立的開發環境,避免套件版本衝突。
安裝完成後,在 Python 中測試一下:
import matplotlib
print(matplotlib.__version__)
看到版本號就代表安裝成功。接下來我們通常會這樣引入:
import matplotlib.pyplot as plt
import numpy as np
這兩行幾乎是所有 Matplotlib 教學的標準開場白,plt 是約定俗成的縮寫,全世界的 Python 開發者都這樣用。
第一張圖:折線圖(Line Chart)
折線圖是最基本也最常用的圖表類型,特別適合顯示時間序列或趨勢變化。來畫一張簡單的折線圖:
import matplotlib.pyplot as plt
months = ['1月', '2月', '3月', '4月', '5月', '6月']
sales = [120, 135, 148, 162, 178, 195]
plt.figure(figsize=(10, 6))
plt.plot(months, sales, marker='o', color='#2196F3', linewidth=2)
plt.title('2026 上半年銷售趨勢', fontsize=16)
plt.xlabel('月份', fontsize=12)
plt.ylabel('銷售額(萬元)', fontsize=12)
plt.grid(True, alpha=0.3)
plt.show()
這段程式碼做了幾件事:設定圖表大小、畫折線、加上標記點、設定標題和軸標籤、加上格線。figsize=(10, 6) 代表圖表寬 10 英吋、高 6 英吋,這個比例通常很好看。
我個人建議新手一定要養成加 plt.grid(True, alpha=0.3) 的習慣,淡淡的格線能讓圖表更容易閱讀,但又不會太搶眼。
長條圖與散佈圖:不同資料用不同圖
選擇正確的圖表類型非常重要。長條圖適合比較不同類別的數值,散佈圖適合觀察兩個變數之間的關係。
長條圖範例:
categories = ['Python', 'JavaScript', 'Java', 'Go', 'Rust']
popularity = [85, 78, 65, 45, 38]
plt.figure(figsize=(10, 6))
plt.bar(categories, popularity, color=['#FF6384','#36A2EB','#FFCE56','#4BC0C0','#9966FF'])
plt.title('2026 程式語言熱門度', fontsize=16)
plt.ylabel('熱門指數', fontsize=12)
plt.show()
散佈圖範例:
import numpy as np
np.random.seed(42)
x = np.random.randn(100)
y = x * 2.5 + np.random.randn(100) * 0.8
plt.figure(figsize=(10, 6))
plt.scatter(x, y, alpha=0.6, edgecolors='white', s=80)
plt.title('變數相關性分析', fontsize=16)
plt.xlabel('X 變數')
plt.ylabel('Y 變數')
plt.show()
散佈圖中的 alpha=0.6 讓點稍微透明,當資料點重疊時能看出密度分佈,這是一個很實用的小技巧。
客製化圖表:標題、圖例、顏色與風格
Matplotlib 的強項就是「什麼都能改」。你可以控制圖表的每一個細節:
plt.figure(figsize=(10, 6))
plt.style.use('seaborn-v0_8-whitegrid')
x = range(1, 13)
plt.plot(x, [i**1.5 for i in x], label='產品 A', linestyle='-', linewidth=2)
plt.plot(x, [i**1.3 + 5 for i in x], label='產品 B', linestyle='--', linewidth=2)
plt.plot(x, [i**1.1 + 10 for i in x], label='產品 C', linestyle='-.', linewidth=2)
plt.title('產品銷售比較', fontsize=18, fontweight='bold')
plt.xlabel('月份', fontsize=14)
plt.ylabel('銷售量', fontsize=14)
plt.legend(loc='upper left', fontsize=12, framealpha=0.9)
plt.tick_params(axis='both', labelsize=11)
plt.tight_layout()
plt.show()
幾個重點:plt.style.use() 可以一鍵套用預設風格,省去很多微調;legend() 的 loc 參數控制圖例位置;tight_layout() 自動調整邊距,避免標籤被切掉。
Matplotlib 內建的風格包括 ggplot、bmh、dark_background 等,可以用 plt.style.available 查看所有選項。我個人最常用 seaborn-v0_8-whitegrid,乾淨又專業。
子圖排版:一次看多張圖
實際工作中,你常常需要把多張圖放在同一個畫布上比較。Matplotlib 的 subplots 功能就是為此而生:
fig, axes = plt.subplots(2, 2, figsize=(14, 10))
# 左上:折線圖
axes[0, 0].plot([1,2,3,4,5], [2,4,6,8,10], 'b-o')
axes[0, 0].set_title('折線圖')
# 右上:長條圖
axes[0, 1].bar(['A','B','C','D'], [25, 40, 30, 55], color='coral')
axes[0, 1].set_title('長條圖')
# 左下:散佈圖
axes[1, 0].scatter(np.random.rand(50), np.random.rand(50), c='green', alpha=0.5)
axes[1, 0].set_title('散佈圖')
# 右下:圓餅圖
axes[1, 1].pie([35, 25, 20, 20], labels=['A','B','C','D'], autopct='%1.0f%%')
axes[1, 1].set_title('圓餅圖')
fig.suptitle('四種常見圖表類型', fontsize=20, fontweight='bold')
plt.tight_layout()
plt.show()
subplots(2, 2) 建立 2x2 的子圖格局,回傳的 axes 是一個二維陣列,用索引就能操作個別子圖。fig.suptitle() 是整個畫布的大標題,和個別子圖的 set_title() 不同。
Seaborn 整合:用更少的程式碼畫更美的圖
如果你覺得 Matplotlib 的預設樣式太陽春,那一定要試試 Seaborn。Seaborn 是建立在 Matplotlib 之上的高階繪圖套件,專為統計視覺化設計,而且預設配色就很好看。
pip install seaborn
import seaborn as sns
import pandas as pd
# 使用 Seaborn 內建資料集
tips = sns.load_dataset('tips')
fig, axes = plt.subplots(1, 2, figsize=(14, 6))
# 箱型圖
sns.boxplot(data=tips, x='day', y='total_bill', palette='Set2', ax=axes[0])
axes[0].set_title('各日消費分佈(箱型圖)')
# 小提琴圖
sns.violinplot(data=tips, x='day', y='total_bill', palette='muted', ax=axes[1])
axes[1].set_title('各日消費分佈(小提琴圖)')
plt.tight_layout()
plt.show()
Seaborn 的優勢在於:自動處理 DataFrame、內建統計計算、配色方案專業。但它的底層就是 Matplotlib,所以你學會的 Matplotlib 知識完全不會浪費。
如果你平時有用 Pandas 做資料處理(推薦看 Python Pandas 資料分析入門),Seaborn 和 Pandas 的搭配簡直天衣無縫。
儲存圖表與顯示設定
畫完圖當然要存起來。savefig() 是你的好朋友:
# 儲存為 PNG(預設)
plt.savefig('sales_chart.png', dpi=300, bbox_inches='tight')
# 儲存為 SVG(向量圖,適合簡報)
plt.savefig('sales_chart.svg', format='svg', bbox_inches='tight')
# 儲存為 PDF
plt.savefig('sales_chart.pdf', format='pdf', bbox_inches='tight')
幾個注意事項:dpi=300 是印刷品質,一般螢幕顯示用 150 就夠了;bbox_inches='tight' 會自動裁掉多餘的空白邊距,非常推薦每次都加上。
另外,savefig 要在 show 之前呼叫,否則存到的會是空白圖片,這是很多新手踩到的坑。
如果你是在 Jupyter Notebook 中工作,加上 %matplotlib inline 魔法指令就能直接在筆記本中顯示圖表。如果你的工作流程涉及自動化報表,也可以搭配 Python Excel 自動化教學 把圖表嵌入 Excel 報告中。
實戰案例:用 Matplotlib 視覺化銷售數據
來看一個比較完整的實戰範例。假設你是某電商公司的數據分析師,需要分析過去一年的銷售數據:
import matplotlib.pyplot as plt
import numpy as np
months = ['1月','2月','3月','4月','5月','6月','7月','8月','9月','10月','11月','12月']
revenue = [180, 165, 210, 195, 230, 245, 220, 260, 275, 310, 380, 420]
orders = [1500, 1350, 1800, 1650, 1950, 2100, 1900, 2250, 2400, 2700, 3200, 3600]
fig, ax1 = plt.subplots(figsize=(14, 7))
# 長條圖:營收
bars = ax1.bar(months, revenue, color='#4CAF50', alpha=0.7, label='營收(萬元)')
ax1.set_xlabel('月份', fontsize=13)
ax1.set_ylabel('營收(萬元)', fontsize=13, color='#4CAF50')
ax1.tick_params(axis='y', labelcolor='#4CAF50')
# 第二個 Y 軸:訂單數
ax2 = ax1.twinx()
ax2.plot(months, orders, color='#FF5722', marker='s', linewidth=2.5, label='訂單數')
ax2.set_ylabel('訂單數', fontsize=13, color='#FF5722')
ax2.tick_params(axis='y', labelcolor='#FF5722')
# 合併圖例
lines1, labels1 = ax1.get_legend_handles_labels()
lines2, labels2 = ax2.get_legend_handles_labels()
ax1.legend(lines1 + lines2, labels1 + labels2, loc='upper left', fontsize=12)
plt.title('2025 年度電商銷售分析', fontsize=18, fontweight='bold', pad=20)
fig.tight_layout()
plt.savefig('annual_sales.png', dpi=200, bbox_inches='tight')
plt.show()
這個範例展示了雙 Y 軸圖表,左邊是長條圖顯示營收、右邊是折線圖顯示訂單數。twinx() 是建立共用 X 軸的第二個 Y 軸。這種圖表在商業報告中非常常見,因為它能同時呈現兩個不同量級的指標。
如果你需要更進階的資料處理功能,像是 Python 裝飾器教學 中介紹的技巧,可以用來封裝你的繪圖函式,讓程式碼更模組化。
Matplotlib vs Plotly:該選哪一個?
很多人會問:「既然有 Plotly 這種互動式繪圖套件,還需要學 Matplotlib 嗎?」我的答案是:必須學。
| 比較項目 | Matplotlib | Plotly |
|---|---|---|
| 學習曲線 | 中等,文件豐富 | 較低,API 直覺 |
| 互動性 | 靜態為主 | 原生互動式 |
| 客製化程度 | 極高,幾乎無限 | 高,但有限制 |
| 輸出格式 | PNG/SVG/PDF | HTML/PNG |
| 適合場景 | 論文、報告、自動化 | Dashboard、網頁展示 |
| 生態系整合 | NumPy/Pandas/Seaborn | Dash 框架 |
| 效能 | 大量資料表現佳 | 大量資料較慢 |
簡單來說:如果你需要出報告、寫論文、做自動化腳本,選 Matplotlib;如果你要做網頁互動式儀表板,選 Plotly。但不管怎樣,Matplotlib 是基礎中的基礎,Plotly 的很多概念也是從 Matplotlib 衍生出來的。
我個人的建議是先把 Matplotlib 學扎實,再視需求去學 Plotly 或 Bokeh。畢竟,能畫出正確的靜態圖,比畫出花俏但錯誤的互動圖重要太多了。
總結:開始用圖表說故事吧
Matplotlib 不只是一個繪圖工具,它是你用資料說故事的媒介。回顧一下這篇教學的重點:
- 安裝簡單:一行 pip install 就搞定
- 基本圖表:折線圖、長條圖、散佈圖是三大基礎
- 客製化豐富:標題、軸標籤、圖例、顏色、風格都能調整
- 子圖排版:用 subplots 在同一畫布上比較多張圖
- Seaborn 加持:統計圖表更美觀、更省力
- 儲存技巧:savefig 搭配 dpi 和 bbox_inches 參數
- 實戰應用:雙 Y 軸圖表展示商業數據
學會這些,你就已經能應付 80% 的資料視覺化需求了。剩下的 20% 就是在實戰中累積經驗,遇到問題查文件、查 Stack Overflow,慢慢就會越來越熟練。
最重要的一點:圖表是為了溝通,不是為了炫技。一張乾淨、清楚的圖表,永遠比一張花俏但看不懂的圖更有價值。現在就打開你的 Jupyter Notebook,開始動手畫你的第一張圖吧!
繼續閱讀
Python 資料分析入門:Pandas 常用操作完整教學
從安裝到實戰,帶你掌握 Pandas 最常用的資料分析操作,包含 DataFrame 建立、資料讀取、篩選清理、GroupBy 分組彙總,附完整程式碼範例。
相關文章
你可能也喜歡
探索其他領域的精選好文