Python基于Matplotlib绘制饼图的详细教程

 更新时间:2025年12月16日 09:48:19   作者:永远是夏天  
饼图是数据可视化中经典的占比类图表,核心用于展示各分类在整体中的比例关系,本文基于Matplotlib详解饼图的绘制方法,涵盖基础绘制、样式定制、进阶优化等核心知识点,结合实战案例让你快速掌握,需要的朋友可以参考下

引言

饼图是数据可视化中经典的占比类图表,核心用于展示各分类在整体中的比例关系,尤其适合类别数量较少(建议不超过8类)的场景。本文基于Matplotlib详解饼图的绘制方法,涵盖基础绘制、样式定制、进阶优化等核心知识点,结合实战案例让你快速掌握。

一、基础饼图绘制

1. 核心语法与最简示例

Matplotlib绘制饼图的核心函数是plt.pie(),只需传入“各分类数值”即可生成基础饼图。 示例:展示某电商平台各品类销售额占比

import matplotlib.pyplot as plt

# 解决中文显示问题(通用配置)
plt.rcParams["font.sans-serif"] = ["SimHei"]  # Windows
# plt.rcParams["font.sans-serif"] = ["PingFang SC"]  # macOS
plt.rcParams["axes.unicode_minus"] = False

# 1. 准备数据:分类名称 + 对应数值(数值会自动计算占比)
categories = ["服饰", "美妆", "食品", "数码", "家居"]
sales = [250, 180, 220, 300, 150]

# 2. 创建画布
plt.figure(figsize=(8, 8))  # 饼图建议用正方形画布,避免变形

# 3. 绘制基础饼图
plt.pie(sales,  # 核心数据:各分类数值
        labels=categories)  # 分类标签

# 4. 显示图表
plt.title("某电商平台各品类销售额占比", fontsize=14)
plt.show()

2. 核心参数解析(基础版)

参数作用示例
x必选,各分类的数值(非占比,Matplotlib自动计算)x=[250, 180, 220]
labels分类标签,对应x的每个数值labels=["服饰","美妆","食品"]
autopct显示各部分占比,支持格式字符串autopct="%1.1f%%"(保留1位小数的百分比)
colors自定义各扇区颜色colors=["#FF6B6B","#4ECDC4","#45B7D1"]
startangle饼图起始角度(默认从x轴正方向开始,逆时针绘制)startangle=90(从y轴正方向开始)

优化版基础饼图(添加占比、自定义颜色):

import matplotlib.pyplot as plt

plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False

categories = ["服饰", "美妆", "食品", "数码", "家居"]
sales = [250, 180, 220, 300, 150]
# 自定义配色(推荐莫兰迪/清新色系,避免刺眼)
colors = ["#FF6B6B", "#4ECDC4", "#45B7D1", "#96CEB4", "#FECA57"]

plt.figure(figsize=(8, 8))
# 绘制饼图,添加占比和颜色
plt.pie(sales,
        labels=categories,
        autopct="%1.1f%%",  # 显示占比(1位小数)
        colors=colors,
        startangle=90)  # 起始角度90度

plt.title("某电商平台各品类销售额占比", fontsize=14)
plt.axis("equal")  # 强制饼图为正圆形(关键!避免拉伸变形)
plt.show()

二、进阶优化:突出重点、提升可读性

1. 突出核心分类(explode参数)

通过explode参数可将指定扇区“分离”出来,突出重点类别(如占比最高的“数码”品类):

import matplotlib.pyplot as plt

plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False

categories = ["服饰", "美妆", "食品", "数码", "家居"]
sales = [250, 180, 220, 300, 150]
colors = ["#FF6B6B", "#4ECDC4", "#45B7D1", "#96CEB4", "#FECA57"]
# explode:对应每个扇区的分离距离,0为不分离,数值越大分离越远
explode = (0, 0, 0, 0.1, 0)  # 仅“数码”扇区分离0.1距离

plt.figure(figsize=(8, 8))
plt.pie(sales,
        labels=categories,
        autopct="%1.1f%%",
        colors=colors,
        startangle=90,
        explode=explode,  # 启用分离效果
        shadow=True)  # 添加阴影,增强立体感

plt.title("某电商平台各品类销售额占比(突出数码品类)", fontsize=14)
plt.axis("equal")
plt.show()

2. 优化标签样式(字体、位置)

默认标签可能重叠或样式单一,可通过textprops调整标签样式,或手动调整占比标签位置:

import matplotlib.pyplot as plt

plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False

categories = ["服饰", "美妆", "食品", "数码", "家居"]
sales = [250, 180, 220, 300, 150]
colors = ["#FF6B6B", "#4ECDC4", "#45B7D1", "#96CEB4", "#FECA57"]
explode = (0, 0, 0, 0.1, 0)

plt.figure(figsize=(8, 8))
# 绘制饼图并捕获文本对象(用于后续调整)
patches, texts, autotexts = plt.pie(
    sales,
    labels=categories,
    autopct="%1.1f%%",
    colors=colors,
    startangle=90,
    explode=explode,
    shadow=True,
    textprops={"fontsize": 11}  # 统一设置标签字体大小
)

# 单独调整占比标签样式(如颜色、加粗)
for autotext in autotexts:
    autotext.set_color("white")  # 占比文字设为白色
    autotext.set_fontweight("bold")  # 加粗

plt.title("某电商平台各品类销售额占比", fontsize=14)
plt.axis("equal")
plt.show()

3. 处理小占比类别(避免标签重叠)

若部分类别占比过小(如<5%),可将其合并为“其他”类,或通过pctdistance调整占比标签位置:

import matplotlib.pyplot as plt

plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False

# 原始数据:含小占比类别
categories = ["服饰", "美妆", "食品", "数码", "家居", "图书", "配饰"]
sales = [250, 180, 220, 300, 150, 30, 20]

# 合并小占比类别(图书+配饰=其他)
new_categories = ["服饰", "美妆", "食品", "数码", "家居", "其他"]
new_sales = [250, 180, 220, 300, 150, 50]
colors = ["#FF6B6B", "#4ECDC4", "#45B7D1", "#96CEB4", "#FECA57", "#DDA0DD"]

plt.figure(figsize=(8, 8))
plt.pie(new_sales,
        labels=new_categories,
        autopct="%1.1f%%",
        colors=colors,
        startangle=90,
        pctdistance=0.85)  # 占比标签距离圆心的比例(默认0.6,调大避免重叠)

plt.title("某电商平台各品类销售额占比(合并小品类)", fontsize=14)
plt.axis("equal")
plt.show()

三、特殊场景:环形饼图(空心饼图)

环形饼图比普通饼图更美观,且可在中心添加文字,适合展示多层占比或突出视觉效果。 实现原理:绘制两个饼图,外层为数据,内层为白色填充的“空心”。

import matplotlib.pyplot as plt

plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False

categories = ["服饰", "美妆", "食品", "数码", "家居"]
sales = [250, 180, 220, 300, 150]
colors = ["#FF6B6B", "#4ECDC4", "#45B7D1", "#96CEB4", "#FECA57"]

plt.figure(figsize=(8, 8))
# 绘制外层数据饼图
plt.pie(sales,
        labels=categories,
        autopct="%1.1f%%",
        colors=colors,
        startangle=90,
        wedgeprops={"width": 0.3})  # width:环形宽度(0-1,越小越细)

# 绘制内层空心(白色填充)
plt.pie([1], colors="white", radius=0.7)  # radius:内层半径(小于外层)

# 中心添加文字
plt.text(0, 0, "总销售额\n1100万", ha="center", va="center", fontsize=12)

plt.title("某电商平台各品类销售额占比(环形图)", fontsize=14)
plt.axis("equal")
plt.show()

四、饼图绘制注意事项

  1. 适用场景:仅用于展示“部分-整体”关系,且类别数不宜过多(建议≤6类),否则扇区过小、可读性差;
  2. 避免误导:饼图的视觉效果易受起始角度、扇区顺序影响,若需精准对比占比,优先用柱状图;
  3. 正圆形保障:务必添加plt.axis("equal"),否则画布拉伸会导致饼图变形为椭圆;
  4. 中文与负号:始终配置rcParams解决中文乱码和负号显示问题;
  5. 保存高清图:用plt.savefig("饼图.png", dpi=300, bbox_inches="tight")替代plt.show(),避免文字截断。

以上就是Python基于Matplotlib绘制饼图的详细教程的详细内容,更多关于Python Matplotlib绘制饼图的资料请关注脚本之家其它相关文章!

相关文章

  • pytorch-autograde-计算图的特点说明

    pytorch-autograde-计算图的特点说明

    这篇文章主要介绍了pytorch-autograde-计算图的特点,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-05-05
  • python实现简易猜数小游戏

    python实现简易猜数小游戏

    大家好,本篇文章主要讲的是python实现简易猜数小游戏,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2022-01-01
  • selenium环境搭建及基本元素定位方式详解

    selenium环境搭建及基本元素定位方式详解

    selenium最初是一个自动化测试工具,而爬虫中使用它主要是为了解决requests无法执行javaScript代码的问题,这篇文章主要介绍了selenium环境搭建及基本元素定位方式,需要的朋友可以参考下
    2023-04-04
  • python输出pdf文档的实例

    python输出pdf文档的实例

    今天小编就为大家分享一篇python输出pdf文档的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-02-02
  • flask框架中勾子函数的使用详解

    flask框架中勾子函数的使用详解

    这篇文章主要介绍了flask框架中勾子函数的使用详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-08-08
  • Python利用多线程优化for循环的技巧分享

    Python利用多线程优化for循环的技巧分享

    多线程可以让程序同时执行多个任务,从而提高整体运行效率,这篇文章将详细介绍如何在Python中使用多线程来优化for循环,感兴趣的可以了解下
    2025-02-02
  • 手把手教你用Python打造互动式中秋节庆祝小程序

    手把手教你用Python打造互动式中秋节庆祝小程序

    中秋节将至,本文提供了一个使用Python开发的中秋节庆祝小程序教程,通过简单的步骤,您可以创建一个具有节日祝福、互动式灯谜游戏和模拟中秋明月动态背景的小程序,文章详细介绍了程序的功能、实现步骤以及如何运行程序,需要的朋友可以参考下
    2024-09-09
  • tensorflow ckpt模型和pb模型获取节点名称,及ckpt转pb模型实例

    tensorflow ckpt模型和pb模型获取节点名称,及ckpt转pb模型实例

    今天小编就为大家分享一篇tensorflow ckpt模型和pb模型获取节点名称,及ckpt转pb模型实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-01-01
  • Python连接Oracle数据库的操作指南

    Python连接Oracle数据库的操作指南

    Oracle数据库是一种强大的企业级关系数据库管理系统(RDBMS),而Python是一门流行的编程语言,两者的结合可以提供出色的数据管理和分析能力,本教程将详细介绍如何在Python中连接Oracle数据库,并演示常见的数据库任务,需要的朋友可以参考下
    2023-11-11
  • Python 数据可视化神器Pyecharts绘制图像练习

    Python 数据可视化神器Pyecharts绘制图像练习

    这篇文章主要介绍了Python 数据可视化神器Pyecharts绘制图像练习,绘制的图形有柱状图、饼状图、箱型图、折线图、雷达图等多种图像,需要的小伙伴可以参考一下
    2022-02-02

最新评论