Matplotlib入门教程(十一):饼图详解——pie() 函数与占比可视化

一、什么是饼图?

饼图(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 直方图,用柱形展示数据的分布规律。

相关推荐
烂蜻蜓7 小时前
Matplotlib入门教程(十):柱形图详解——bar() 与 barh() 函数完全指南
matplotlib
ctlover4 天前
Matplotlib
matplotlib
for_ever_love__6 天前
Matplotlib——把训练曲线和分布画出来
matplotlib·数据可视化·大模型开发·训练曲线
茶栀(*´I`*)12 天前
【Python数据可视化】Matplotlib从零到精通:图表核心解剖、多子图布局与三大经典图表实战
python·信息可视化·matplotlib
jzshmyt23 天前
我用 Python 从零“生成“了一个宇宙,然后让它观察自己(v14)
人工智能·pytorch·python·numpy·matplotlib·空间计算·scipy
小葱炖豆腐1 个月前
python绘制excel折线图
python·excel·numpy·pandas·matplotlib
七灵微1 个月前
【AI】代码实战- 基于时间序列的轴承检测1
人工智能·机器学习·ai·pandas·matplotlib
微小冷1 个月前
pyqt+matplotlib多进程图像刷新
pyqt·matplotlib·进程通信·多进程·queue·process
㳺三才人子2 个月前
初探 Data Analysis - Matplotlib
python·plotly·pandas·matplotlib