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