跳到主要內容

Day 20 Matplotlib 基礎

Day 20 Matplotlib 基礎

引言

資料分析做完之後,最常被問的問題是「可以畫成圖嗎?」一張清楚的圖,勝過千筆數字。Python 生態圈中,畫圖的標準工具是 Matplotlib:從 2003 年發布至今,已經成為資料視覺化的事實標準,幾乎所有 Python 圖表函式庫(Seaborn、Pandas 內建繪圖等)底層都呼叫它。學會 Matplotlib 不只是學一個套件,更是學會一套「描述資料」的通用語言。

今天要建立 Matplotlib 的基礎功。我們會先理解 figure 與 axes 的概念,再用幾行程式碼畫出折線圖、長條圖與散佈圖,最後學會加上標題、座標軸標籤與圖例,讓圖表能完整傳達資訊。學完這一篇,之後不管是寫報告、做簡報、或部署到網頁,都能輕鬆上手。這篇會假設你已經裝好 Matplotlib 3.9 以上版本,並熟悉基本的 Python 語法。

figure 與 axes:理解 Matplotlib 的兩層架構

Matplotlib 的圖由兩個層級組成:「figure」是整張畫布,「axes」是畫布上的一個子圖區。一張 figure 可以有多個 axes(例如 2×2 的子圖網格),每個 axes 都有自己的座標系、標題與圖例。這種設計的好處是:當我們要畫多張關聯的子圖時,可以把它們放在同一張 figure 上共享資訊,但又各自有獨立的樣式設定。

import matplotlib.pyplot as plt

fig, ax = plt.subplots()
ax.plot([1, 2, 3, 4], [10, 20, 25, 30])
ax.set_title("簡單折線圖")
ax.set_xlabel("x 軸")
ax.set_ylabel("y 軸")
plt.show()

這段程式碼做了三件事:建立一個 figure、加入一個 axes、呼叫 plot() 把資料點連起來。執行後會顯示一張從左下到右上、緩慢上升的折線圖。fig, ax = plt.subplots() 是目前最推薦的寫法,比早期 plt.plot() 直接呼叫更清楚,也更容易擴充。習慣這種寫法後,未來要改成 2×2 子圖也只需要改一個參數:plt.subplots(2, 2)。

折線圖:呈現趨勢變化

折線圖是觀察「隨時間變化」最直覺的圖。Day 19 我們處理過每日銷售資料,今天就用 Matplotlib 把月銷售趨勢畫出來。折線圖適合資料點之間有先後順序或連續性的情境,例如月份、星期、產品編號;如果類別之間沒有順序關係,用長條圖會更清楚。

import matplotlib.pyplot as plt

months = ["1 月", "2 月", "3 月", "4 月", "5 月", "6 月"]
sales = [120, 145, 130, 180, 210, 195]

fig, ax = plt.subplots(figsize=(8, 4))
ax.plot(months, sales, marker="o", color="steelblue", linewidth=2)
ax.set_title("上半年銷售趨勢")
ax.set_xlabel("月份")
ax.set_ylabel("銷售額(萬元)")
ax.grid(True, linestyle="--", alpha=0.5)
plt.show()

輸出會是一張六個資料點的折線圖,每個點用圓圈標出,並以淺藍色線段連接。圖上的虛線格線能讓讀者更容易對應到具體的數值。figsize=(8, 4) 設定圖的寬高(單位是英吋),marker="o" 決定資料點的形狀,grid() 則是加上格線。除了 "o",常用的 marker 還有 "s"(方形)、"^"(三角形)、"D"(菱形),選一個讀者容易區分的形狀就好。

長條圖:比較類別之間的差距

當我們想比較不同類別的數值(例如各分店業績、各產品銷量),長條圖比折線圖更合適。Matplotlib 用 bar() 畫垂直長條圖,用 barh() 畫水平長條圖。長條圖的視覺優勢是「長度」直接對應到數值,比折線圖更容易讓讀者一眼判斷高低。

import matplotlib.pyplot as plt

products = ["A", "B", "C", "D"]
quantities = [320, 280, 410, 175]

fig, ax = plt.subplots(figsize=(7, 4))
ax.bar(products, quantities, color=["#4C72B0", "#DD8452", "#55A467", "#C44E52"])
ax.set_title("各產品銷售數量")
ax.set_xlabel("產品")
ax.set_ylabel("數量")
plt.show()

輸出是一張四根直立的長條,每根顏色不同,方便一眼看出 C 產品銷量最高、D 產品最低。如果類別名稱很長(例如縣市名),改用 ax.barh(quantities, products) 把長條畫成水平方向,會更易讀。每根長條的顏色可以用 color 統一指定,也可以傳入一個串列讓每根長條有自己的顏色,後者在強調「第一名」、「最差」時特別好用。

散佈圖:探索兩個變數的關係

散佈圖(scatter plot)把每一筆資料畫成一個點,特別適合觀察「廣告花費 vs. 營收」、「身高 vs. 體重」這類兩個連續變數之間的關係。如果點呈現往上或往下的趨勢,就代表兩者有正相關或負相關;如果點散亂分布,就代表兩者沒有明顯關係。散佈圖是探索性分析時最常畫的圖之一。

import matplotlib.pyplot as plt

height = [165, 170, 175, 180, 168, 172, 178, 182]
weight = [55, 65, 70, 78, 58, 63, 75, 80]

fig, ax = plt.subplots(figsize=(7, 5))
ax.scatter(height, weight, color="teal", s=80, alpha=0.7)
ax.set_title("身高與體重分佈")
ax.set_xlabel("身高(公分)")
ax.set_ylabel("體重(公斤)")
plt.show()

輸出是一張散布圖,點大致由左下往右上分布,代表身高越高、體重通常也越高。s 參數控制點的大小,alpha 控制透明度,當資料點很多時,把透明度調低一點能避免重疊的點完全遮住彼此。s 也可以傳入一個串列,讓每個點依某個變數(例如年齡、營收)有不同大小,這在表達「第三個變數」時非常方便。

加入圖例與多組資料

一張圖常常需要比較多組資料,例如「台北 vs. 高雄的月銷售」。Matplotlib 用 label 與 legend() 來處理圖例,搭配不同顏色與線型就能清楚區分。當多組資料畫在同一個 axes 上時,圖例能避免讀者把線搞混。

import matplotlib.pyplot as plt

months = ["1 月", "2 月", "3 月", "4 月", "5 月", "6 月"]
taipei = [120, 145, 130, 180, 210, 195]
kaohsiung = [95, 110, 125, 140, 160, 175]

fig, ax = plt.subplots(figsize=(8, 4))
ax.plot(months, taipei, marker="o", label="台北", color="steelblue")
ax.plot(months, kaohsiung, marker="s", label="高雄", color="darkorange")
ax.set_title("雙北 vs. 高雄 銷售比較")
ax.set_xlabel("月份")
ax.set_ylabel("銷售額(萬元)")
ax.legend(loc="upper left")
ax.grid(True, linestyle="--", alpha=0.5)
plt.show()

輸出是一張有兩條線、兩個標記形狀(圓形與方形)的折線圖,右上角或左上角會自動顯示圖例。圖例的位置可以透過 loc 參數調整,常用的有 "upper left"、"lower right"、"best"(自動找最佳位置)。除了位置,legend() 也支援設定標題、邊框、字型大小等參數,做為簡報用的圖表時,這些細節往往決定了專業度。

儲存圖片與圖表設定

畫完圖之後,常需要存成 PNG 或 PDF 檔。Matplotlib 用 savefig() 輸出,並提供一些參數控制解析度與邊界。這個步驟看似簡單,但常常是新手最容易出錯的地方——忘了呼叫 savefig() 就直接關閉 Jupyter Notebook,結果什麼都沒存到。

fig, ax = plt.subplots(figsize=(7, 4))
ax.bar(["A", "B", "C"], [10, 20, 15])
ax.set_title("範例圖")

fig.savefig("sales.png", dpi=150, bbox_inches="tight")

dpi=150 設定輸出解析度,數字越大越清晰;bbox_inches="tight" 會自動裁掉多餘的白色邊界。常用格式除了 PNG,還有 PDF(適合印刷)、SVG(向量圖,適合嵌入網頁)、JPG(檔案較小)。如果圖表中含有中文字型,建議存成 SVG 或 PDF,避免 PNG 在不同系統上字型變樣。savefig() 必須在 show() 之前呼叫,否則存到的可能是空白的 figure。

結語

今天從 Matplotlib 的兩層架構出發,建立了 figure 與 axes 的觀念,並透過折線圖、長條圖、散佈圖三個常用範例,理解如何選擇適合的圖表類型。圖例、標題、座標軸標籤、格線這些細節,雖然簡單,卻是讓圖「專業度」起飛的關鍵。明天我們會介紹 Seaborn——一個基於 Matplotlib、專門用來畫統計圖表的函式庫,用更少的程式碼就能做出更具統計意涵的圖。

明天,我們會介紹 Seaborn——一個基於 Matplotlib、專門用來畫統計圖表的函式庫。它用更少的程式碼,就能做出更美觀、更具統計意涵的圖。

留言

這個網誌中的熱門文章

Day 2 變數與資料型別

Day 2 變數與資料型別 引言 寫程式的過程中,變數與資料型別是處理資料的基礎。變數是存放資料的容器,資料型別則決定這筆資料有哪些特性、可以進行哪些操作。學會定義變數、認識各種資料型別,是學好 Python 的關鍵一步。 這篇文章會帶你了解 Python 中變數的觀念、如何定義變數,以及常見的資料型別,包括整數、浮點數、字串、布林值,還有串列、元組、字典與集合等容器型別。我們也會介紹變數的命名規則與撰寫風格建議,以及如何用 type() 檢查資料型別。 什麼是變數?如何在 Python 中定義變數 變數是在程式執行時用來存放資料的名稱。透過定義變數,我們可以給一筆資料一個名字,並在程式的其他地方用這個名字取用該筆資料。在 Python 中,變數不需要事先宣告型別,因為 Python 是動態型別語言,變數的型別由指定給它的值決定。 定義變數的基本語法 在 Python 中定義變數非常簡單,只要用賦值符號 = 把值指定給變數即可。例如: x = 5 # 定義變數 x,並把整數 5 賦值給它 name = "Alice" # 定義變數 name,並把字串 "Alice" 賦值給它 在這裡,x 是一個變數,被賦予整數 5;name 是另一個變數,被賦予字串 "Alice"。 變數的更新與覆寫 變數的值可以修改,也就是說,我們可以在程式的不同地方給同一個變數新的值。例如: x = 10 # x 最初被賦予 10 x = 15 # x 的值現在被更新為 15 這樣就能依照需求,在程式執行過程中靈活調整變數的值。 Python 的動態型別系統 Python 和某些靜態型別語言不同,定義變數時不需要宣告型別。賦值時,Python 會根據值自動判斷變數的型別。例如: x = 5 # x 是整數 x = 3.14 # x 變成浮點數 x = "Hi" # x 變成字串 同一個變數在程式執行過程中可以存放不同型別的值,這是 Python 的彈性之一。 常見資料型別 在 Python 中,資料型別決定我們可以對變數進行哪些操作...

Day 1 Python 簡介與環境設定

Day 1 Python 簡介與環境設定 引言 在現在的科技環境裡,程式設計已經是一項重要技能。無論你是對資料科學有興趣、想成為開發者,或是想踏入人工智慧(AI)領域,學會寫程式都能明顯提升你的競爭力。在眾多程式語言中,Python 因為語法簡單、功能強大、應用範圍廣泛,成為許多人進入程式世界的第一選擇。這篇文章會帶你認識 Python 的背景與優勢,並一步步教你在不同系統上安裝與設定 Python 開發環境,最後寫出第一支 Python 程式。 為什麼選擇 Python? Python 是一種高階程式語言,由 Guido van Rossum 在 1991 年發布。Python 的設計哲學強調程式碼的可讀性,並用縮排來定義程式區塊,這點和許多使用大括號的語言不同。簡潔的語法讓它成為初學者的理想選擇;就算是經驗豐富的開發者,也能用它完成複雜的專案。 Python 的優勢如下: 簡單易學 :Python 的語法清楚、結構簡潔,初學者很快就能上手。和其他語言相比,學習曲線相對平緩,不需要先弄懂一堆複雜觀念,就能開始寫程式。 應用範圍廣泛 :從資料科學、網頁開發、人工智慧、機器學習、自動化測試到網路爬蟲,Python 都有大量開源函式庫與工具支援,而且在這些領域都扮演關鍵角色。 豐富的函式庫與框架 :Python 的函式庫生態系非常龐大。做資料分析有 NumPy、Pandas;開發網站有 Django、Flask;做深度學習有 TensorFlow、PyTorch。各種需求幾乎都能找到對應的套件,讓開發更有效率。 跨平台支援 :Python 支援 Windows、macOS、Linux 等作業系統,程式通常不需要太多修改就能跨平台執行,讓開發與部署更有彈性。 活躍的社群 :Python 擁有龐大的開發者社群。學習或開發上遇到問題,幾乎都能在社群與論壇(例如 Stack Overflow)找到答案,對初學者來說是很強的後盾,也能減少卡關時的挫折感。 Python 的應用領域 Python 的流行與強大功能,讓許多領域都開始大量使用它。以下是幾個常見的應用方向: 資料科學 :隨著大數據與人工智慧興起,資料科學大量使用 Python。NumPy、Pandas 與 Matplotlib 等工具能處理和分析龐...

Python 從入門到 PyTorch 深度學習:開啟 AI 世界的大門

Python 從入門到 PyTorch 深度學習:開啟 AI 世界的大門 隨著人工智慧(AI)與深度學習(Deep Learning)快速發展,越來越多人對這些技術產生興趣。不論你是想踏入 AI 領域的初學者,還是已經有程式基礎的開發者,學好 Python 與深度學習框架(例如 PyTorch),都能為你打開更多可能。 為什麼選擇 Python? Python 已經是資料科學與人工智慧領域的首選語言。它的語法簡潔、容易上手,而且擁有龐大的生態系與大量開源函式庫。無論是資料處理、資料視覺化,還是建立機器學習與深度學習模型,Python 都能勝任。對想進入 AI 或資料科學領域的人來說,它幾乎是必備工具。 PyTorch 是什麼? PyTorch 是由 Meta(原 Facebook)AI 研究團隊開發的開源深度學習框架,以易用、靈活和動態計算圖著稱,是許多 AI 研究人員與開發者的首選。相較於其他框架,PyTorch 的寫法更貼近原生 Python,對初學者相對友善。無論是簡單的實驗,還是複雜的深度學習模型,PyTorch 都能提供強大的支援。 這個系列能帶給你什麼? 這個系列會從 Python 的基礎開始,帶你一步一步學習,最後能自己用 PyTorch 建立深度學習模型。即使你完全沒有寫過程式,也能跟著文章的節奏累積技能,理解 AI 與深度學習的核心觀念。 本系列涵蓋的主題 Python 基礎:從變數、條件判斷到函式與模組。 資料處理工具:用 NumPy 與 Pandas 有效率地操作資料。 資料視覺化:用 Matplotlib 與 Seaborn 把資料畫成圖表。 深度學習的數學基礎:線性代數、微積分與機率。 PyTorch 入門:理解張量、模型建構與 GPU 加速。 基礎深度學習模型:CNN 與 RNN 的實作應用。 深度學習專案實戰:從資料前處理到模型部署的端到端流程。 誰適合這個系列? 程式初學者 :如果你對 AI 充滿好奇,卻還沒寫過程式,系列的第一部分會帶你快速上手 Python,並幫助你理解深度學習的基本觀念。 資料科學愛好者 :如果你已經熟悉一些資料處理方法,進階部分會教你如何用 PyTorch 建構深度學習模型。 開發者與研究人員 :想更深入了...