Matplotlib 饼图(建议收藏)
💡一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 ;- 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;
截止目前, 星球 内专栏累计输出 82w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2900+ 小伙伴加入学习 ,欢迎点击围观
在数据可视化领域,Matplotlib 饼图凭借其直观的展示方式,成为分析数据分布比例的常用工具。无论是展示市场份额、人口结构还是销售占比,饼图都能以简洁的方式将复杂数据转化为易于理解的视觉信息。本文将从零开始,系统讲解如何使用 Matplotlib 绘制和定制饼图,帮助编程初学者快速上手,同时为中级开发者提供进阶技巧。
环境准备与基础概念
安装与导入库
使用 Matplotlib 绘制饼图前,需确保已安装相关依赖库。通过以下命令安装:
pip install matplotlib numpy pandas
在代码中导入库:
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
饼图的核心逻辑
饼图通过扇形区域的面积比例来反映数据占比。其核心逻辑是:
- 数据输入:提供数值型数据(如
[25, 35, 40]
),表示各部分的数值。 - 标签映射:通过
labels
参数将数值与文字标签(如['A', 'B', 'C']
)关联。 - 比例计算:Matplotlib 会自动将数值归一化为百分比,并计算扇形区域的弧度。
比喻:想象将数据看作一块蛋糕,饼图的作用就是将蛋糕按比例切分,并标注每块的名称和大小。
基础语法:绘制第一个饼图
数据准备
假设我们有以下销售数据:
departments = ['Sales', 'Marketing', 'IT']
revenues = [150000, 80000, 50000]
绘制基础饼图
通过 plt.pie()
函数即可快速生成饼图:
plt.figure(figsize=(8, 6))
plt.pie(revenues, labels=departments)
plt.title('Department Revenue Distribution')
plt.show()
此代码会生成一个简单饼图,但可能缺少关键信息(如百分比)。
定制化设置:提升饼图的可读性
添加百分比显示
通过 autopct
参数格式化数值:
plt.pie(revenues,
labels=departments,
autopct='%1.1f%%') # 显示保留一位小数的百分比
效果:每个扇形区域将显示精确的数值占比,例如 42.9%
。
调整颜色与突出显示
颜色设置
使用 colors
参数或内置色板(如 plt.cm.tab20
):
colors = ['#ff9999', '#66b3ff', '#99ff99']
plt.pie(revenues, labels=departments, colors=colors)
突出某部分数据
通过 explode
参数将特定扇形“拉出”:
explode = (0.1, 0, 0) # 第一个部门(Sales)突出显示
plt.pie(revenues,
labels=departments,
explode=explode,
autopct='%1.1f%%')
比喻:就像用手指轻轻捏起蛋糕的一角,让重要数据更显眼。
添加图例与标题
plt.pie(revenues, labels=departments, autopct='%1.1f%%')
plt.title('Department Revenue Distribution', pad=20)
plt.legend(title="Departments",
loc="best",
bbox_to_anchor=(1, 0.5)) # 图例放置在右侧
进阶技巧:分层饼图与复杂场景
分层饼图(环形图)
通过调整 wedgeprops
的 width
参数,可创建环形效果:
plt.pie(revenues,
labels=departments,
autopct='%1.1f%%',
wedgeprops={'width': 0.4, 'edgecolor': 'white'}) # 宽度设为0.4,边缘留白
3D 效果与阴影
添加立体感:
from matplotlib import cm
plt.pie(revenues,
labels=departments,
autopct='%1.1f%%',
shadow=True, # 添加阴影
startangle=90, # 起始角度设为90度,使饼图垂直
explode=(0.1, 0, 0),
colors=cm.Pastel1.colors)
plt.axis('equal') # 确保饼图正圆
处理多数据集:嵌套饼图
若需展示多层级数据(如部门内细分团队),可叠加饼图:
team_revenues = [80000, 50000, 20000]
plt.figure(figsize=(10, 8))
plt.pie(revenues,
radius=1.3,
labels=departments,
wedgeprops=dict(width=0.3, edgecolor='w'))
plt.pie(team_revenues,
radius=1.3 - 0.3,
labels=['Team A', 'Team B', 'Team C'],
wedgeprops=dict(width=0.3, edgecolor='w'))
plt.show()
常见问题与解决方案
1. 数据总和超过100%
Matplotlib 会自动归一化数据,但若需手动控制:
normalized_revenues = revenues / sum(revenues) * 100
plt.pie(normalized_revenues, labels=departments)
2. 标签重叠问题
通过 textprops
调整标签字体大小,或使用 plt.tight_layout()
:
plt.pie(revenues,
labels=departments,
textprops={'fontsize': 10}) # 减小标签字体
plt.tight_layout()
3. 如何导出高质量图片?
plt.savefig('pie_chart.png',
dpi=300,
bbox_inches='tight') # 保存为300dpi的PNG
结论
通过本文的讲解,读者已掌握从基础到进阶的 Matplotlib 饼图 绘制技巧。无论是快速生成简单图表,还是定制复杂分层结构,Matplotlib 提供了丰富的参数和灵活的接口。建议读者通过实际数据练习,逐步探索更多功能(如动画效果、交互式图表)。记住,饼图的核心价值在于清晰传达数据比例关系,合理选择颜色、布局和细节调整,能让图表更具说服力和专业性。
如需进一步优化可视化效果,可结合 Pandas 处理数据,或探索 Seaborn 等高级库,但 Matplotlib 饼图始终是数据可视化的基石工具。期待读者在实践中发现更多可能性!