Python matplotlib绘制饼图
饼图的基本概念:
核心定义:
饼图(Pie Chart)是一种用于表示数据分类和相对大小(比例型数据)的可视化图形,核心作用是直观展示“不同分类数据与整体数据的占比关系”。其核心逻辑为用“整个圆形”来代表数据的总量(100%),所有分类的数值之和必须能构成这个“整体”。
构成要素及含义:
|
饼图的核心用途(适用场景):
1、需直观展示“部分—整体”的比例关系(如“各产品营收占总营收的比例”“各年龄段用户占总用户的比例”);
2、需突出“关键分类的占比优势”(如“某产品占总营收的60%是核心收入来源”);
3、分类数量不宜过多(通常建议≤6 类),否则扇形会过于拥挤,失去可视化的简洁性。
实例 1:绘制基础饼图(带百分比和图例)
数据:某公司各部门员工占比
使用pyplot模块中的函数pie()绘制饼图。默认情况下,pyplot的pie()功能沿逆时针方向排列饼图中的饼形或楔形。
第一个参数传入用于绘制饼图的数据列表,其他参数都是关键字参数。Labels(departments)参数用于设置每个扇形的标签,说明每个扇形的数据归属。autopct参数用于设置饼图中的百分比,一般保留两位小数,传入"%1.2f%%"即可。startangle 参数用于设置饼图的起始绘制角度(以x轴正方向为0度,逆时针旋转)。
代码:
import matplotlib.pyplot as plt
# 部门名称列表(标签数据)
departments = ['技术部', '市场部', '财务部', '人力资源部']
# 各部门员工数量
employees = [45, 25, 15, 15]
# 自定义颜色列表(为每个部门分配不同颜色)
colors = ['blue', 'red', 'green', 'yellow']
# 设置中文字体,确保中文正常显示
plt.rcParams["font.family"] = ["SimHei", "WenQuanYi Micro Hei", "Heiti TC", "Microsoft YaHei"]
# 创建画布
plt.figure(figsize=(8, 6))
# 绘制饼图(包含labels和colors参数)
plt.pie(
employees,
labels=departments, # 显示部门名称标签
colors=colors, # 应用自定义颜色
autopct='%1.2f%%', # 显示百分比
startangle=90 # 从正上方开始绘制
)
plt.axis('equal') # 保证饼图为正圆形
plt.title('公司各部门员工占比分布') # 图表标题
plt.legend(title='部门', loc='lower right') # 显示图例
# 显示图形
plt.show()

上面的饼图绘制了公司各部门员工的占比情况,明确显示技术部占比45.00%、市场部占比25.00%、财务部占比15.00%、人力资源部占比15.00%,饼图用于展示数据的分布和比例关系,每个扇形的面积大小表示该组分在整体中所占的比例,可以一目了然地看到各个部门员工的占比情况。
实例 2:突出显示特定部分
数据:某产品销售渠道占比
代码:
在绘制饼图的pie()函数中,explode参数用于设置每个扇形到圆心的距离,传入一个与数据列表长度相等的列表,默认每个扇形到圆心的距离都是0,将想要分离展示的扇形距离设置成一个适合的值,如0.1,即可将该部分突出展示。
对扇形进行分离展示后,将shadow参数设置为True,给饼图添加阴影,使饼图更立体,饼图切分的效果会更好。
在对饼图进行分离后,饼图的布局会发生变化,为了控制饼图占用的区域是一个正方形,且避免饼图变成椭圆形,使用axis('equal')函数,传入'equal'参数。
import matplotlib.pyplot as plt
channels = ['线上商城', '实体店', '代理商', '其他']
sales = [55, 25, 15, 5]
# 定义各部分的分离距离,0.1表示将第一个部分(线上商城)向外分离10%半径的距离
explode = [0.1, 0, 0, 0]
plt.rcParams["font.family"] = ["SimHei", "WenQuanYi Micro Hei", "Heiti TC"]
plt.figure(figsize=(8, 6))
plt.pie(sales,
explode=explode, # 设置各部分的分离效果,突出显示重要部分
labels=channels,
autopct='%1.1f%%',
shadow=True, # 添加阴影效果
colors=['#ff9999','#66b3ff','#99ff99','#ffcc99']) #十六进制色值
# 设置坐标轴比例相等,确保饼图显示为正圆形(否则可能呈现椭圆形)
plt.axis('equal')
plt.title('产品销售渠道占比分析')
plt.show()

这张“产品销售渠道占比分析”饼图呈现了不同销售渠道在整体销售中所占的比例情况:
线上商城:占比高达55.0%,是该产品最主要的销售渠道,说明线上销售模式在产品推广和销售中占据主导地位。
实体店:占比为25.0%,作为传统销售渠道,仍占据一定份额。
代理商:占比15.0%,通过代理商进行销售,能够借助代理商的资源和渠道拓展市场。
其他:占比5.0%,这部分可能涵盖了一些小众、新兴或者尚未明确分类的销售渠道,虽然占比小,但也反映出销售渠道存在一定的多样性。
实例3:绘制环形饼图(圆环图)
环形饼图相比普通饼图更适合展示分类数据的占比关系,同时中间的空白区域可以有效利用来显示总标题或关键数据。
数据:某网站流量来源分布
代码:
要绘制环形的饼图,可借助pie()函数,通过`wedgeprops` 参数来设置圆环宽度,以此实现环形效果,无需绘制两个饼图。因为环形饼图是通过设置圆环宽度实现的,阴影展示会不完全,看起来比较别扭,所以不设置 `shadow` 参数,去掉阴影。另外,`pie()` 函数中的 `pctdistance` 参数用于设置百分比显示离圆心的距离,默认值是 `0.6`,设置环形效果时,可将 `pctdistance` 参数增大,使百分比显示在环形的中间。
import matplotlib.pyplot as plt
traffic_sources = ['直接访问', '搜索引擎', '社交媒体', '外部链接', '广告推广']
percentages = [30, 25, 15, 18, 12]
# 设置中文字体
plt.rcParams["font.family"] = ["SimHei", "WenQuanYi Micro Hei", "Heiti TC"]
# 自定义颜色
colors = ['#ff6b6b', '#4ecdc4', '#45b7d1', '#ffaaa5', '#feca57']
# 创建画布
plt.figure(figsize=(8, 8))
# 绘制饼图,通过wedgeprops参数设置圆环宽度
wedges, texts, autotexts = plt.pie(
percentages,
labels=traffic_sources,
colors=colors,
autopct='%1.1f%%', # 显示百分比
startangle=140, # 起始角度
pctdistance=0.85, # 百分比标签距离中心的位置
wedgeprops=dict(width=0.3, edgecolor='w') # width控制圆环宽度,edgecolor设置边缘颜色
)
# 美化文本
plt.setp(texts, size=12) # 设置标签字体大小
plt.setp(autotexts, size=10, color='white', weight='bold') # 设置百分比文本样式
# 添加中心文本(环形中间的文字)
plt.text(0, 0, '流量来源分布', ha='center', va='center', fontsize=14, weight='bold')
# 保证图形为正圆形
plt.axis('equal')
# 添加标题
plt.title('网站访问流量来源占比', fontsize=16, pad=20)
plt.show()

“网站访问流量来源占比”饼图展示了不同渠道为网站带来流量的比例情况:
直接访问:占比达到30%,是所有渠道中占比最高的。
搜索引擎:占比25%,是第二大流量来源渠道。
外部链接:占比18%,意味着其他网站的链接为该网站带来了不少流量。
社交媒体:占比15%,显示出社交媒体平台也为网站贡献了一定的流量。
广告推广:占比12%,相比其他渠道,占比相对较低。
更多推荐



所有评论(0)