首先這是我們的資料:
import pandas as pd
data = pd.read_csv("新北市1999市政服務專線便民服務工作成果表(每月).csv")
資料內皆為年月資料,但我們想分析年度資料,所以先做groupby處理:
#建立年度欄位
data["民國年"] = list(map(lambda x: str(x)[0:3] + "年",data["民國年月"]))
#groupby
data = data.drop(columns=["民國年月","項目"]).groupby("民國年").agg("mean").reset_index().round()
為了方便繪製圓餅圖,我們先將資料轉置一下:
#資料轉置,並重設索引
data = data.T.reset_index()
#轉置未能自動補上欄位,所以手動讓第一行的資料作為欄位名稱
data.columns = data.iloc[0]
#然後調整正確的欄位名稱,並刪除不需要的第一行
data.rename(columns={"民國年":"變項"},inplace=True)
data.drop([0],inplace=True)
最後得到我們繪圖所需的資料:
開始繪製圓餅圖:
import matplotlib
#選擇字體為:Microsoft YaHei
matplotlib.rc("font",family="Microsoft YaHei")
from matplotlib import pyplot as plt
#---------------------------------
#建立圖的大小
plt.figure(figsize=(16,4))
#---------------------------------
#建立第一個子圖
ax0 = plt.subplot2grid((2,8),(0,0),colspan=8,rowspan=1)
#建立x軸(年度)與y軸(總計)的資料
ax0_x = data.columns.tolist() #取所有欄位名稱
del(ax0_x[0]) #刪除第一個元素:"變項"
ax0_y = data.iloc[3].drop("變項") #取第4行的資料,並刪除元素:"變項",只留數字資料
#繪制直條圖
ax0.bar(ax0_x,height=ax0_y,color="darkslategray")
#加上圖表文字
for x,y in zip(ax0_x,ax0_y):
ax0.text(x,
y+10000,
str(round(y/10000))+"萬",
horizontalalignment="center",
color="black")
#設定y軸相關資訊
ax0.set_ylim(0,150000)
ax0.set_yticks([])
ax0.set_yticklabels([])
#刪除上、左、右邊的圖框
ax0.spines[["top","left","right"]].set_visible(False)
#--------------------------
#刪除索引4的資料(總計),保留剩餘的資料,來繪製圓餅圖
data_pie = data.drop([4])
#繪製圓餅圖
for i,x in zip(range(0,8),ax0_x):
globals()[f"ax{i}"] = plt.subplot2grid((2,8),(1,i),colspan=1,rowspan=1) #安排每個圓餅圖的子圖位置
e = [0.1,0,0] #圓餅圖的突出係數
#繪製圓餅圖
globals()[f"ax{i}"].pie(data_pie[x], #圓餅圖的資料
colors=["darkcyan","c","cyan"], #顏色
explode=e, #突出係數
textprops={"size":10}, #圓餅圖內文字大小
autopct="%.1f%%", #加上各部分的比例數字
shadow=True) #加上陰影
#繪製圖例
plt.legend(labels=["諮詢服務","轉接電話","陳情案件"],bbox_to_anchor=(-2.4,0),ncols=3)
#補上整張圖的標題
plt.suptitle("新北市1999市政服務專線\n歷年進線總量直條圖及案件類別圓餅圖")