圓餅圖 Pie Chart
這篇教學會使用 matplotlib pyplot 模組裡的 pie() 方法,將資料繪製成圓餅圖 ( Pie Chart ),並進一步介紹 pie() 的相關用法。
本篇使用的 Python 版本為 3.7.12,所有範例可使用 Google Colab 實作,不用安裝任何軟體 ( 參考:使用 Google Colab )
import matplotlib
要進行本篇的範例,必須先載入 matplotlib 函式庫的 pyplot 模組,範例將其獨立命名為 plt。
import matplotlib.pyplot as plt
pyplot.pie() 參數說明
pyplot.pie() 常用的參數如下表所示 ( 完整參數參考:matplotlib.pyplot.pie ):
參數 | 說明 |
---|---|
x | 必填,產生圓餅圖的數據。 |
radius | 圓餅圖半徑,預設 1。 |
counterclock | 圓餅圖方向,預設 True 逆時針,設定 False 為順時針。 |
startangle | 起始角度,預設 0 度 ( 水平向右 )。 |
labels | 顯示標籤,預設不顯示,支援陣列資料。 |
labeldistance | 標籤與圓餅圖的距離,預設 1.1。 |
explode | 往外延伸的距離,預設 0,支援陣列資料。 |
shadow | 陰影,預設 Fasle 無陰影,設定 True 有陰影。 |
autopct | 內部文字 ( 自動計算百分比 ),預設無,可使用函式產生和組合。 |
textprops | 文字樣式,使用字典格式,相關屬性參考:Text properties and layout。 |
wedgeprops | 扇形樣式,使用字典格式,相關屬性參考:matplotlib.patches.Wedge。 |
pctdistance | 內部文字與中心點距離,預設 0.6。 |
繪製第一張圓餅圖
下方的程式碼,執行後會根據數據資料畫出圓餅圖,如果不設定顏色,程式會自動將不同的資料套用不同顏色。
import matplotlib.pyplot as plt
x = [1,2,3,4,5]
plt.pie(x, radius=1.5, labels=x)
plt.show()
額外設定 pie() 的參數,就能讓圓餅圖有更多變化,下方的例子加入了 explode 往外延伸、startangle 起始角度和 textprops 文字樣式設定。
import matplotlib.pyplot as plt
x = [1,2,3,4,5]
e = [0,0,0,0,0.1]
plt.pie(x,
radius=1.5,
labels=x,
explode=e,
startangle=60,
textprops={'weight':'bold','size':16})
plt.show()
圓餅圖的內部百分比
設定 autopct 參數後,會自動計算個別資料在總資料裡所佔的百分比,並顯示計算後的百分比,預設使用「串格式化 %」的方式呈現。
import matplotlib.pyplot as plt
x = [1,2,3,4,5]
plt.pie(x,
radius=1.5,
labels=x,
autopct='%.1f%%') # %.1f%% 表示顯示小數點一位的浮點數,後方加上百分比符號
plt.show()
autopct 支援函式,下方的例子使用 lambda 匿名函式,將百分比數值的後方加上原本的資料內容,再搭配文字的樣式設定,做出更清楚的圖表。
import matplotlib.pyplot as plt
x = [1,2,3,4,5]
def func(s,d):
t = int(round(s/100.*sum(d))) # 透過百分比反推原本的數值
return f'{s:.1f}%\n( {t}ml )' # 使用文字格式化的方式,顯示內容
plt.pie(x,
radius=1.5,
textprops={'color':'w', 'weight':'bold', 'size':12}, # 設定文字樣式
pctdistance=0.8,
autopct=lambda i: func(i,x),
wedgeprops={'linewidth':3,'edgecolor':'w'}) # 繪製每個扇形的外框
plt.show()
搭配 NumPy 繪製圓餅圖
由於 matplotlib 能完美的和 NumPy 整合,所以能透過 NumPy 強大的處理或產生數據能力,快速產生許多繪圖用的數據,下方的例子,使用 NumPy 產生 100~1000 隨機五個數字,使用 matplotlib 繪製出結果。
from numpy import random
import matplotlib.pyplot as plt
x = random.randint(100,1000,5)
def func(s,d):
t = int(round(s/100.*sum(d))) # 透過百分比反推原本的數值
return f'{s:.1f}%\n( {t}ml )' # 使用文字格式化的方式,顯示內容
plt.pie(x,
radius=1.5,
textprops={'color':'w', 'weight':'bold', 'size':12}, # 設定文字樣式
pctdistance=0.7,
autopct=lambda i: func(i,x),
wedgeprops={'linewidth':3,'edgecolor':'w'}) # 繪製每個扇形的外框
plt.show()
意見回饋
如果有任何建議或問題,可傳送「意見表單」給我,謝謝~