iT邦幫忙

2026 iThome 鐵人賽

DAY 3
0
自我挑戰組

Python 爬蟲與資料分析實戰:從網路資料到資訊視覺化系列 第 27 篇

Day 27|Matplotlib 圖表美化與多組資料比較

  • 分享至 

  • xImage
  •  

前幾天我學會了使用 Matplotlib 製作長條圖、直方圖、圓餅圖和散佈圖。不過,只有把資料畫出來還不夠,如果圖表沒有標題、數值標籤或清楚的比較方式,就很難快速看出資料代表的意義。

因此今天要繼續練習 Matplotlib,學習如何調整圖表外觀、顯示數值,以及將不同的分析結果放在同一個畫面比較。這次一樣使用 Google Colab 實作,並以書籍資料作為練習範例。

一、建立練習資料

先建立一份書籍資料,包含書名、價格和評分。為了讓程式可以直接執行,這次先使用範例資料。

import pandas as pd
import matplotlib.pyplot as plt

data = {
"title": [
"Book A", "Book B", "Book C",
"Book D", "Book E", "Book F",
"Book G", "Book H"
],
"price": [15.5, 22.0, 18.5, 35.0, 42.0, 28.5, 12.0, 31.0],
"rating": [3, 4, 3, 5, 5, 4, 2, 4]
}

df = pd.DataFrame(data)

print(df)

這裡先匯入 Pandas 和 Matplotlib,再使用 Dictionary 建立資料,最後轉換成 DataFrame。

price 代表書籍價格,rating 代表書籍評分。實際爬蟲資料也可以使用相同的方式進行分析,只要欄位名稱和資料型態符合即可。

二、製作有數值標籤的長條圖

之前使用 plt.bar() 就可以畫出長條圖,但如果想知道每個長條的實際數值,還需要自己查看原始資料。

Matplotlib 提供 bar_label(),可以直接在長條上顯示數值。

rating_counts = df["rating"].value_counts().sort_index()

plt.figure(figsize=(8, 5))

bars = plt.bar(
rating_counts.index,
rating_counts.values,
color="steelblue"
)

plt.bar_label(bars)

plt.title("Number of Books by Rating")
plt.xlabel("Rating")
plt.ylabel("Number of Books")
plt.xticks([1, 2, 3, 4, 5])

plt.tight_layout()
plt.show()

這段程式有幾個值得注意的地方:

value_counts():計算每個評分出現幾次。

sort_index():依照評分順序排列,避免類別順序混亂。

plt.figure(figsize=(8, 5)):設定圖表大小。

color="steelblue":設定長條的顏色。

plt.bar_label(bars):在長條上方顯示數值。

plt.tight_layout():調整圖表間距,避免文字被裁切。

完成後,就可以直接從圖表看出哪個評分的書籍數量最多,不必再反覆查看資料表。

三、比較不同評分的平均價格

除了計算書籍數量,也可以分析不同評分的書籍,平均價格是否有所差異。

這次使用 Pandas 的 groupby() 分組,再計算各組的平均價格。

avg_price = df.groupby("rating")["price"].mean()

plt.figure(figsize=(8, 5))

bars = plt.bar(
avg_price.index,
avg_price.values,
color="darkorange"
)

plt.bar_label(bars, fmt="%.2f")

plt.title("Average Book Price by Rating")
plt.xlabel("Rating")
plt.ylabel("Average Price")
plt.xticks([1, 2, 3, 4, 5])

plt.tight_layout()
plt.show()

其中,groupby("rating") 會依照評分分組,["price"].mean() 則計算每個評分類別的平均價格。

另外,fmt="%.2f" 可以讓數值顯示到小數點後兩位,例如 25.50,讓圖表更容易閱讀。

需要注意的是,平均價格較高不代表評分一定較高。這張圖只能呈現目前資料中的關聯,不能直接證明價格會影響評分。

四、把兩張圖放在同一個畫面

如果每次只能看一張圖,就需要不斷切換才能比較不同分析結果。這次使用 subplots(),將兩張圖放在同一個畫面。

左邊顯示不同評分的書籍數量,右邊顯示不同評分的平均價格。

rating_counts = df["rating"].value_counts().sort_index()
avg_price = df.groupby("rating")["price"].mean()

fig, axes = plt.subplots(1, 2, figsize=(12, 5))

左邊:書籍數量

bars1 = axes[0].bar(
rating_counts.index,
rating_counts.values,
color="steelblue"
)

axes[0].bar_label(bars1)
axes[0].set_title("Book Count by Rating")
axes[0].set_xlabel("Rating")
axes[0].set_ylabel("Book Count")
axes[0].set_xticks([1, 2, 3, 4, 5])

右邊:平均價格

bars2 = axes[1].bar(
avg_price.index,
avg_price.values,
color="darkorange"
)

axes[1].bar_label(bars2, fmt="%.2f")
axes[1].set_title("Average Price by Rating")
axes[1].set_xlabel("Rating")
axes[1].set_ylabel("Average Price")
axes[1].set_xticks([1, 2, 3, 4, 5])

plt.tight_layout()
plt.show()

這次使用的 axes 可以理解成每張子圖各自的控制介面。

axes[0] 代表左邊的圖,axes[1] 代表右邊的圖。使用 axes[0].set_title() 設定標題,與直接使用 plt.title() 的概念相似,只是現在可以分別控制每一張圖。

plt.subplots(1, 2) 代表建立一列、兩欄的圖表配置。如果想改成上下排列,也可以調整成 plt.subplots(2, 1)。

透過這種方式,就能在同一個畫面中觀察書籍數量和平均價格,讓分析結果更完整。

五、將圖表儲存成圖片

除了在 Colab 裡顯示圖表,也可以把分析結果存成圖片,方便之後放進報告或簡報。

在剛才的程式中,將以下程式碼放在 plt.show() 之前:

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

這裡的 dpi=150 用來設定圖片解析度,而 bbox_inches="tight" 可以減少圖片周圍多餘的空白。

在 Google Colab 中,如果想把圖片下載到電腦,可以執行:

from google.colab import files

files.download("book_analysis.png")

注意:如果要儲存的是兩張子圖組成的完整畫面,應該使用 fig.savefig();而且儲存程式碼要放在對應的 plt.show() 之前執行。

六、今天的實作整理

今天練習了幾個重要的圖表功能:

使用 figsize 調整圖表大小。

使用 color 設定圖表顏色。

使用 bar_label() 顯示長條圖數值。

使用 groupby() 分組計算平均價格。

使用 subplots() 同時顯示多張圖。

使用 savefig() 儲存圖表,並從 Colab 下載。

這些功能看起來只是調整圖表外觀,但在實際分析資料時很重要。圖表除了要正確呈現數據,也需要讓閱讀的人快速理解分析結果。

七、課後練習

接下來可以試著自己修改程式:

將長條圖的顏色換成其他顏色。

把書籍數量圖改成不同價格區間的書籍數量。

將圖表標題改成自己想分析的主題。

嘗試增加第三張圖,顯示所有書籍的價格分布。

完成後,可以比較修改前後的圖表,看看哪一種呈現方式最容易理解。

今日心得

今天學習了如何調整 Matplotlib 圖表的外觀,也練習將不同的分析結果放在同一個畫面比較。我發現資料視覺化不只是把數字變成圖表,還需要考慮標題、數值和排列方式,才能讓分析結果更清楚。接下來會繼續把爬蟲、資料清理、資料庫和視覺化串在一起,為最後的完整專題做準備。


上一篇
Day 26|Python 資料視覺化入門:使用 Matplotlib 將資料轉換成圖表
下一篇
Day 28|整合 Pandas 與 Matplotlib:製作完整資料分析報表
系列文
Python 爬蟲與資料分析實戰:從網路資料到資訊視覺化 共 30 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言