( 图表 ) 圆饼图
这篇教学会使用 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()
微信扫码关注
抖音扫码关注