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  

饼图的核心逻辑

饼图通过扇形区域的面积比例来反映数据占比。其核心逻辑是:

  1. 数据输入:提供数值型数据(如 [25, 35, 40]),表示各部分的数值。
  2. 标签映射:通过 labels 参数将数值与文字标签(如 ['A', 'B', 'C'])关联。
  3. 比例计算: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))  # 图例放置在右侧  

进阶技巧:分层饼图与复杂场景

分层饼图(环形图)

通过调整 wedgepropswidth 参数,可创建环形效果:

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 饼图始终是数据可视化的基石工具。期待读者在实践中发现更多可能性!

最新发布