一、什么是饼图?
饼图(Pie Chart)是一种常用的数据可视化图形,用来展示各类别在总体中所占的比例。
饼图的作用:
| 作用 | 说明 |
|---|---|
| 展示占比 | 直观呈现各部分占整体的比例 |
| 突出主次 | 快速识别最大/最小份额 |
| 构成分析 | 展示整体由哪些部分组成 |
饼图的适用与不适用:
| 适合 | 不适合 |
|---|---|
| 类别数量少(3-6 个) | 类别过多(超过 8 个) |
| 占比差异明显 | 占比非常接近 |
| 强调部分与整体 | 强调精确数值对比 |
实践建议: 类别超过 6 个时,建议改用柱形图或条形图,饼图会显得拥挤且难以比较。
二、pie() 函数语法
python
matplotlib.pyplot.pie(x, explode=None, labels=None, colors=None, autopct=None, pctdistance=0.6, shadow=False, labeldistance=1.1, startangle=0, radius=1, counterclock=True, wedgeprops=None, textprops=None, center=(0, 0), frame=False, rotatelabels=False, *, normalize=None, data=None)
核心参数说明:
| 参数 | 说明 |
|---|---|
x |
浮点型数组或列表,用于绘制饼图的数据,表示每个扇形的面积 |
explode |
数组,表示各个扇形之间的间隔,默认值为 0 |
labels |
列表,各个扇形的标签,默认值为 None |
colors |
数组,表示各个扇形的颜色 |
autopct |
设置饼图内各个扇形百分比显示格式 |
labeldistance |
标签的绘制位置,相对于半径的比例,默认 1.1 |
pctdistance |
类似于 labeldistance,指定 autopct 的位置刻度,默认 0.6 |
shadow |
布尔值,设置饼图的阴影,默认 False |
radius |
设置饼图的半径,默认 1 |
startangle |
起始角度,默认从 x 轴正方向逆时针画起 |
counterclock |
是否逆时针绘制,默认 True |
wedgeprops |
字典,指定扇形的属性,如边框线颜色、宽度 |
textprops |
字典,指定文本标签的属性,如字体大小、颜色 |
center |
浮点列表,指定饼图中心位置,默认 (0, 0) |
frame |
布尔值,是否绘制饼图的边框,默认 False |
rotatelabels |
布尔值,是否旋转文本标签,默认 False |
autopct 格式化说明:
| 格式 | 效果 |
|---|---|
'%d%%' |
整数百分比,如 35% |
'%0.1f' |
一位小数,如 35.0 |
'%0.1f%%' |
一位小数百分比,如 35.0% |
'%0.2f%%' |
两位小数百分比,如 35.00% |
三、基础饼图
python
import matplotlib.pyplot as plt import numpy as np y = np.array([35, 25, 25, 15]) plt.pie(y) plt.show()
效果: 四个扇形,自动分配颜色,从 x 轴正方向逆时针绘制。
注意: 默认情况下,第一个扇形的绘制是从 x 轴开始并逆时针移动。
四、设置标签与颜色
python
import matplotlib.pyplot as plt import numpy as np y = np.array([35, 25, 25, 15]) plt.pie(y, labels=['A', 'B', 'C', 'D'], # 设置饼图标签 colors=["#d5695d", "#5d8ca8", "#65a479", "#a564c9"], # 设置饼图颜色 ) plt.title("RUNOOB Pie Test") # 设置标题 plt.show()
labels 与 colors 的顺序: 与数据 y 中的元素一一对应。
常用颜色搭配方案:
| 方案 | 颜色 |
|---|---|
| 柔和 | #d5695d、#5d8ca8、#65a479、#a564c9 |
| 明快 | yellowgreen、gold、lightskyblue、lightcoral |
| 商务 | #4CAF50、#2196F3、#FF9800、#9C27B0 |
五、突出显示扇形(explode 参数)
explode 用于让某个扇形从中心"弹出",起到强调作用。
python
import matplotlib.pyplot as plt # 数据 sizes = [15, 30, 45, 10] # 饼图的标签 labels = ['A', 'B', 'C', 'D'] # 饼图的颜色 colors = ['yellowgreen', 'gold', 'lightskyblue', 'lightcoral'] # 突出显示第二个扇形 explode = (0, 0.1, 0, 0) # 绘制饼图 plt.pie(sizes, explode=explode, labels=labels, colors=colors, autopct='%1.1f%%', shadow=True, startangle=90) # 标题 plt.title("RUNOOB Pie Test") # 显示图形 plt.show()
代码解析:
| 参数 | 作用 |
|---|---|
sizes = [15, 30, 45, 10] |
各扇形的数据 |
labels = ['A', 'B', 'C', 'D'] |
各扇形的标签 |
colors = [...] |
各扇形的颜色 |
explode = (0, 0.1, 0, 0) |
第二个扇形向外偏移 0.1 |
autopct='%1.1f%%' |
显示一位小数的百分比 |
shadow=True |
添加阴影效果 |
startangle=90 |
从 y 轴正方向开始绘制 |
explode 取值说明:
| 值 | 效果 |
|---|---|
0 |
不偏移 |
0.1 |
轻微弹出 |
0.2 |
明显弹出 |
0.5 |
大幅弹出 |
提示: 值越大,扇形距离中心越远,强调效果越强。但不要过大,否则会脱离整体。
六、完整示例:突出显示 + 百分比格式化
python
import matplotlib.pyplot as plt import numpy as np y = np.array([35, 25, 25, 15]) plt.pie(y, labels=['A', 'B', 'C', 'D'], # 设置饼图标签 colors=["#d5695d", "#5d8ca8", "#65a479", "#a564c9"], # 设置饼图颜色 explode=(0, 0.2, 0, 0), # 第二部分突出显示 autopct='%.2f%%', # 格式化输出百分比 ) plt.title("RUNOOB Pie Test") plt.show()
参数组合效果:
| 配置 | 效果 |
|---|---|
explode=(0, 0.2, 0, 0) |
第二个扇形明显弹出 |
autopct='%.2f%%' |
显示两位小数百分比,如 23.53% |
七、进阶参数应用
1. 调整标签与百分比位置
python
import matplotlib.pyplot as plt sizes = [15, 30, 45, 10] labels = ['A', 'B', 'C', 'D'] plt.pie(sizes, labels=labels, autopct='%1.1f%%', labeldistance=1.2, # 标签距离中心 1.2 倍半径 pctdistance=0.6) # 百分比显示在 0.6 倍半径处 plt.show()
| 参数 | 位置 |
|---|---|
labeldistance=1.1(默认) |
标签在饼图外侧 |
labeldistance=0.5 |
标签在饼图内侧 |
pctdistance=0.6(默认) |
百分比在饼图内部 |
pctdistance=1.2 |
百分比在饼图外部 |
2. 设置扇形边框
python
import matplotlib.pyplot as plt sizes = [15, 30, 45, 10] labels = ['A', 'B', 'C', 'D'] plt.pie(sizes, labels=labels, wedgeprops={'linewidth': 2, 'edgecolor': 'white'}) plt.show()
wedgeprops 常用键:
| 键 | 说明 |
|---|---|
linewidth |
边框宽度 |
edgecolor |
边框颜色 |
width |
扇形宽度(用于环形图) |
环形图技巧:
wedgeprops={'width': 0.3}可以做出环形图(甜甜圈图)效果。
3. 设置文本样式
python
import matplotlib.pyplot as plt sizes = [15, 30, 45, 10] labels = ['A', 'B', 'C', 'D'] plt.pie(sizes, labels=labels, autopct='%1.1f%%', textprops={'fontsize': 14, 'color': 'darkblue'}) plt.show()
八、实战:中文占比图
python
import matplotlib.pyplot as plt # 中文配置 plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False # 数据 labels = ['产品A', '产品B', '产品C', '产品D'] sizes = [35, 25, 25, 15] colors = ['#4CAF50', '#2196F3', '#FF9800', '#9C27B0'] explode = (0.1, 0, 0, 0) # 突出显示产品A plt.figure(figsize=(8, 6)) plt.pie(sizes, explode=explode, labels=labels, colors=colors, autopct='%1.1f%%', shadow=True, startangle=90, textprops={'fontsize': 12}) plt.title("各产品销售额占比", fontsize=16) plt.axis('equal') # 保证饼图是正圆 plt.tight_layout() plt.show()
关键点:
| 代码 | 作用 |
|---|---|
plt.axis('equal') |
保证饼图为正圆,不被拉成椭圆 |
explode=(0.1, 0, 0, 0) |
突出显示第一个扇形 |
startangle=90 |
从 12 点钟方向开始 |
shadow=True |
添加阴影,增强立体感 |
九、pie() 返回值
pie() 函数还可以返回三个参数:
| 返回值 | 说明 |
|---|---|
wedges |
包含扇形对象的列表 |
texts |
包含文本标签对象的列表 |
autotexts |
包含自动生成的文本标签对象的列表 |
使用示例:
python
import matplotlib.pyplot as plt sizes = [15, 30, 45, 10] labels = ['A', 'B', 'C', 'D'] wedges, texts, autotexts = plt.pie(sizes, labels=labels, autopct='%1.1f%%') # 修改百分比文本样式 for autotext in autotexts: autotext.set_color('white') autotext.set_fontsize(12) # 修改扇形属性 for wedge in wedges: wedge.set_edgecolor('white') wedge.set_linewidth(2) plt.show()
用途: 返回对象后可以精细控制每个元素的样式,适合复杂定制需求。
十、饼图绘制流程图
十一、常见问题排查
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| 饼图显示为椭圆 | 未设置等比例坐标 | 添加 plt.axis('equal') |
| 中文显示为方块 | 未配置字体 | 设置 font.sans-serif |
| 百分比不显示 | 未设置 autopct |
添加 autopct='%1.1f%%' |
| explode 长度不符 | 与数据长度不一致 | 确保 explode 元素数量与 sizes 相同 |
| 标签重叠 | 类别过多或标签过长 | 减少类别或调整 labeldistance |
| 颜色数量不符 | colors 长度错误 | 确保颜色数量与数据一致 |
| 起始角度不对 | 未设置 startangle |
设置 startangle=90 从顶部开始 |
十二、小结
本篇你掌握了 Matplotlib 饼图的完整用法:
-
pie() 函数 :
x为数据,labels为标签,colors为颜色。 -
扇形突出 :
explode让特定扇形弹出,值越大距离越远。 -
百分比格式化 :
autopct控制显示格式,如'%1.1f%%'。 -
位置控制 :
labeldistance控制标签位置,pctdistance控制百分比位置。 -
起始角度 :
startangle设置起始方向,counterclock控制顺逆时针。 -
进阶定制 :
wedgeprops设扇形属性,textprops设文本样式。 -
正圆保证 :
plt.axis('equal')避免饼图被拉伸。
饼图是展示占比关系的经典图表。下一篇我们将学习 Matplotlib 直方图,用柱形展示数据的分布规律。