iT邦幫忙

2025 iThome 鐵人賽

DAY 19
0
自我挑戰組

Python × 政府開放資料:30天數據探索與圖表呈現系列 第 19

Day 19 整合圖表 - 縣市 vs 月份雙維度

  • 分享至 

  • xImage
  •  

在分別分析了各縣市的違規面積排名和整體月份趨勢後,下一步是將這兩個維度整合起來,以進行更深入的觀察。透過一張堆疊長條圖(Stacked Bar Chart),我們能同時呈現每個縣市在不同月份的違規面積貢獻,這有助於我們理解:

單一縣市的月份分佈:某個縣市的違規面積高峰是否集中在特定月份?
縣市間的月份比較:不同縣市的月份趨勢是否相同?例如,A縣市在夏季違規面積最高,而B縣市在春季。

這種多維度整合圖表,能夠提供比單一圖表更豐富的資訊。例如,管理者不僅知道「臺北市違規面積最多」,還能進一步了解「臺北市的違規面積主要集中在哪些月份」,從而針對性地調整巡查計畫。

程式實作

我們將使用Pandas的groupby()函式來對數據進行分組,並繪製堆疊長條圖。首先,需要將原始的月份欄位進行「融化(melt)」操作,將橫向的月份數據轉為縱向的「月份」與「面積」欄位,方便後續的數據處理與繪圖。

import pandas as pd
import matplotlib.pyplot as plt

# 設定中文字型
plt.rcParams["font.family"] = "Heiti TC"
plt.rcParams["axes.unicode_minus"] = False

# 讀取 CSV,跳過中文標題列
df = pd.read_csv("IT_land_violation/land_violation.csv", skiprows=[1])

# 定義月份欄位
months = [
    "Jan",
    "Feb",
    "Mar",
    "Apr",
    "May",
    "Jun",
    "Jul",
    "Aug",
    "Sep",
    "Oct",
    "Nov",
    "Dec",
]

# 轉數字
df[months] = df[months].apply(pd.to_numeric, errors="coerce")

# 移除「總計」列
df = df[df["County_Area_Hectare"] != "總計"]

# 融化數據:將月份欄位轉為單一列
df_melted = df.melt(
    id_vars=["County_Area_Hectare"],
    value_vars=months,
    var_name="Month",
    value_name="Violation_Area",
)

# 繪製堆疊長條圖
fig, ax = plt.subplots(figsize=(15, 8))
df_melted.groupby(["County_Area_Hectare", "Month"])[
    "Violation_Area"
].sum().unstack().plot(kind="bar", stacked=True, ax=ax)

# 調整圖表標題與標籤
plt.title("各縣市月份違規土地面積分佈", fontsize=16)
plt.xlabel("縣市", fontsize=12)
plt.ylabel("違規土地面積 (公頃)", fontsize=12)
plt.xticks(rotation=45, ha="right")
plt.legend(title="月份", bbox_to_anchor=(1.05, 1), loc="upper left")
plt.tight_layout()
plt.show()

https://ithelp.ithome.com.tw/upload/images/20250907/20178624ecgXrKgd3k.pnghttps://ithelp.ithome.com.tw/upload/images/20250907/20178624tmfw53tAND.png


上一篇
Day 18 地圖可視化 – 各縣市違規面積熱力圖
下一篇
Day 20 觀察趨勢&討論 - 結論與洞察
系列文
Python × 政府開放資料:30天數據探索與圖表呈現20
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言