首页 > 编程笔记 > Python笔记 阅读:7

Matplotlib pie():绘制饼图(附带实例)

饼图广泛地应用于各个领域,用于表示不同分类的占比情况,通过弧度大小来对比各种分类。

饼图通过将一个圆饼按照分类的占比划分成多个区块,整个圆饼代表数据的总量,每个区块(圆弧)表示该分类占总体的比例大小,所有区块(圆弧)的加和等于 100%。

在 Matplotlib 中,利用 pie() 函数绘制饼图。函数的格式为:
matplotlib.pyplot.pie(x, explode=None, labels=None, colors=None, autopct=None, labeldistance=1.1, pctdistance=0.6, shadow=False, radius=1, startangle=0, counterclock=True, wedgeprops=None, textprops=None, center=0, 0, frame=False, rotatelabels=False, *, normalize=None, data=None)
各个参数的含义如下表所示:

参数名称 描述
x 浮点型数组,表示每个扇形的面积。
explode 数组,表示各个扇形之间的间隔,默认值为 0。
labels 列表,表示各个扇形的标签,默认值为 None。
colors 数组,表示各个扇形的颜色,默认值为 None。
autopct 设置饼图内各个扇形的百分比显示格式,%d%% 为整数百分比,%0.1f 为一位小数,%0.1f%% 为一位小数百分比,%0.2f%% 为两位小数百分比。
labeldistance 表示标签标记的绘制位置相对于半径的比例,默认值为 1.1,如小于 1 则绘制在饼图内侧。
pctdistance 类似于 labeldistance,指定 autopct 的位置刻度,默认值为 0.6。
shadow 布尔值 True 或 False,设置饼图的阴影,默认为 False,不设置阴影。
radius 设置饼图的半径,默认为 1。
startangle 表示起始绘制饼图的角度,默认为从 x 轴正方向逆时针画起,如设定 startangle=90 则从 y 轴正方向画起。
counterclock 布尔值,设置指针方向,默认为 True,即逆时针,False 表示顺时针。
wedgeprops 字典类型,默认值为 None,参数字典传递给 wedge 对象用来画一个饼图,例如 wedgeprops={'linewidth': 5} 设置 wedge 线宽为 5。
textprops 字典类型,默认值为 None,传递给 text 对象的字典参数,用于设置标签(labels)和比例文字的格式。
center 浮点类型的列表,默认值为(0,0),用于设置图标中心位置。
frame 布尔类型,默认值为 False;如果是 True,则绘制带有表的轴框架。
rotatelabels 布尔类型,默认值为 False;如果为 True,则旋转每个 label 到指定的角度。

【实例】利用 pie() 函数绘制饼图。
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
election_data = {'Biden': 280, 'Trump': 214, 'Others': 528-270-204}
candidate = [key for key in election_data]
votes = [value for value in election_data.values()]
plt.figure(figsize=(10, 10), dpi=100)
plt.pie(votes, labels=candidate, autopct="%1.2f%%", colors=['c', 'm', 'y'],
        textprops={'fontsize': 24}, labeldistance=1.05)
plt.legend(fontsize=16)
plt.title("2022年A国大选票数占比", fontsize=24)
plt.show()
运行程序,效果如下图所示:


图 1 饼图

饼图将一个圆饼按照各分类的占比划分成多个扇形,整个圆饼代表数据的总量,每个扇形表示该分类占总体的比例大小,所有扇形相加的和等于 100%。饼图适用于表示不同分类在总体中的占比情况,通过弧度大小来比较不同分类的占比大小,尤其在需要突出显示其中某一个部分的占比时。

图 1 的饼图绘制了 2022 年 A 国大选的票数占比情况,可以一目了然地看到候选人的得票占比情况。如果需要突出显示某位候选人的得票占比,可以对饼图进行分离展示。

【实例 2】实现旋转饼图和突出显示。
plt.figure(figsize=(10, 10), dpi=100)
explode = (0.1, 0, 0)
plt.pie(votes, labels=candidate, autopct="%1.2f%%", colors=['c', 'm', 'y'],
        textprops={'fontsize': 24},
        labeldistance=1.05, explode=explode, startangle=90, shadow=True)
plt.legend(loc='upper right', fontsize=16)
plt.title("2022年A国大选票数占比", fontsize=24)
plt.axis('equal')
plt.show()
运行程序,效果如下图所示:


图 2 突显效果

在绘制饼图的 pie() 函数中,explode 参数用于设置每个扇形到圆心的距离,传入一个与数据列表长度相等的列表,默认每个扇形到圆心的距离都是 0,将想要分离展示的扇形距离设置成一个适合的值,如 0.1,即可将该部分突出展示。

为了展示效果更好,可以使用 startangle 参数对饼图进行旋转(如将分离的扇形旋转到左侧),给 startangle 参数传入一个角度,将饼图逆时针旋转对应的角度,startangle 参数表示的是饼图的起始角度,默认为正右方向,即传统的 x 轴正方形,此方向表示 0°,设置起始角度后可以实现旋转的效果。对扇形进行分离展示后,将 shadow 参数设置为 True,给饼图添加阴影,使饼图更立体,饼图切分的效果会更好。

在对饼图进行分离后,饼图的布局会发生变化,为了控制饼图占用的区域是一个正方形,且避免饼图变成椭圆形,使用 axis('equal')() 函数,传入 'equal' 参数。

在图 2 饼图的基础上,经过设置后,将获胜者 Biden 的得票率突出显示,可以更突出地展示获胜者的得票占比。

【实例】绘制环形饼图。
plt.figure(figsize=(10, 10), dpi=100)
explode = (0, 0, 0)
plt.pie(votes, labels=candidate, explode=explode, autopct="%1.2f%%", colors=['c', 'm', 'y'],
        textprops={'fontsize': 24}, labeldistance=1.05, pctdistance=0.85, startangle=90)
plt.pie([1], radius=0.7, colors='w')
plt.legend(loc='upper right', fontsize=16)
plt.title("2022年A国大选票数占比", fontsize=24)
plt.axis('equal')
plt.show()
运行程序,效果如下图所示:


图 3 环形饼图

相关文章