什么是饼图?
饼图(Pie Chart)是一种将整体划分为多个部分的圆形统计图表,每个扇区的弧长(面积)代表该部分占整体的比例。它能直观展示部分与整体的关系,适用于展示分类数据的占比情况,如市场份额、预算分配、人口构成等。
饼图的核心要素
- 扇区:每个扇形代表一个类别
- 百分比标签:显示各类别的精确占比
- 图例:说明各类别对应的颜色
- 强调区块:可突出显示关键数据(如最大/最小部分)
Python实现饼图的两种方式(附代码示例)
示例1:基础饼图 - 公司部门预算分配
import matplotlib.pyplot as plt
# 数据准备
departments = ['研发', '市场', '行政', '人力资源']
budget = [45, 30, 15, 10] # 单位:百万元
colors = ['#FF6B6B', '#4ECDC4', '#FFD166', '#6A0572']
# 创建饼图
plt.figure(figsize=(8, 6))
plt.pie(
budget,
labels=departments,
colors=colors,
autopct='%1.1f%%', # 显示百分比
startangle=90, # 起始角度
explode=(0.1, 0, 0, 0) # 突出研发部门
)
# 添加标题
plt.title('2023年部门预算分配', fontsize=14)
plt.axis('equal') # 保证圆形
plt.tight_layout()
plt.savefig('budget_pie.png', dpi=300)
plt.show()
示例2:多层饼图 - 电商平台品类销售分析
import pandas as pd
import matplotlib.pyplot as plt
# 创建示例数据
data = {
'一级品类': ['电子', '服装', '家居'],
'销售额': [500, 300, 200],
'二级品类': [
['手机', '电脑', '相机'],
['男装', '女装', '童装'],
['家具', '厨具', '装饰']
],
'二级销售额': [
[300, 150, 50],
[120, 100, 80],
[80, 70, 50]
]
}
# 创建画布
fig, ax = plt.subplots(figsize=(10, 8))
# 外层饼图(一级品类)
wedges_outer, _ = ax.pie(
data['销售额'],
radius=1,
labels=data['一级品类'],
colors=['#FF9AA2', '#FFB7B2', '#FFDAC1'],
wedgeprops=dict(width=0.3, edgecolor='w')
)
# 内层饼图(二级品类)
for i, (category, sales) in enumerate(zip(data['二级品类'], data['二级销售额'])):
ax.pie(
sales,
radius=0.7,
labels=category,
labeldistance=0.7,
colors=plt.cm.Pastel1(range(len(sales))),
wedgeprops=dict(width=0.3, edgecolor='w')
)
# 添加中心空白圆
centre_circle = plt.Circle((0,0), 0.4, color='white')
ax.add_patch(centre_circle)
# 添加标题
plt.title('电商平台品类销售结构', fontsize=14)
plt.axis('equal')
plt.tight_layout()
plt.savefig('nested_pie.png', dpi=300)
plt.show()
示例3:动态交互饼图(Plotly)
import plotly.express as px
# 数据准备
data = px.data.gapminder().query("year == 2007")
continent_data = data.groupby('continent')['pop'].sum().reset_index()
# 创建交互式饼图
fig = px.pie(
continent_data,
values='pop',
names='continent',
title='2007年全球人口分布',
hole=0.3, # 环形图
color_discrete_sequence=px.colors.qualitative.Pastel
)
# 添加悬浮信息
fig.update_traces(
textposition='inside',
textinfo='percent+label',
hovertemplate="<b>%{label}</b><br>占比: %{percent}</br>人口: %{value}"
)
fig.show()
饼图使用的最佳实践
-
适用场景:
- 展示3-6个类别的占比
- 突出最大/最小部分
- 显示简单比例关系
-
避免误区:
- 类别不宜超过7个(否则用条形图更合适)
- 避免比例相近的扇区(<5%差异)
- 不要用3D饼图(扭曲视觉比例)
-
增强可读性技巧:
plt.pie( ..., autopct=lambda p: f'{p:.1f}%' if p > 5 else '', # 小数值不显示标签 pctdistance=0.85, # 调整标签位置 textprops={'fontsize': 9, 'color':'black'} # 文本样式 )
-
创新变体:
- 环形图(添加
wedgeprops={'width':0.3}
) - 玫瑰图(极坐标条形图)
- 旭日图(分层级展示)
- 环形图(添加
各场景推荐工具
需求类型 | 推荐库 | 优势 |
---|---|---|
静态基础饼图 | Matplotlib | 高度可定制,PDF出版级质量 |
交互式展示 | Plotly | 支持悬浮信息、点击事件 |
网页嵌入 | Seaborn | 简洁API,美观默认样式 |
动态数据 | Pygal | SVG输出,流畅动画效果 |
通过Python可视化库,饼图从简单的静态图表发展为支持交互、动画的多维数据展示工具,成为数据故事叙述中不可或缺的组成部分。