Python如何使用Matplotlib模块的pie()函数绘制饼形图?

1 模块安装

  • 先安装matplotlib
python 复制代码
pip install matplotlib
  • 安装numpy模块,安装matplotlib时候就已经安装这个依赖了,所以不用装了,当然也可以独立安装:
  • 安装pandas
python 复制代码
pip install numpy

2 实现思路

  • 数据存放在excel中,对指定数据进行分析,所以需要用到pandas
  • 对指定数据分析后绘制饼形图,需要用到Matplotlib模块的pie()函数;
  • 对以下指定excel内容进行分析;
  • 分析用户购买区域情况占比,以下数据仅为参考,无真实意义,把以下内容保存为data.xlsx:
python 复制代码
用户	    金额	    地址
user001	130.22	重庆
user002	55.64	江苏省
user003	33	    江苏省
user004	158.23	重庆
user005	124.56	安徽省
user006	33.26	山东省
user007	59.9	吉林省
user008	34.9	福建省
user009	45.36	山西省 
user010	35.23	河南省
user011	123.25	广东省
user012	44.25	河北省
user013	58.26	广东省
user014	83.79	贵州省
user015	59.99	广东省
user016	63.12	福建省
user017	110.78	湖北省
user018	120.21	上海
user019	42.59	山东省
user020	78.99	山西省
user021	1150	浙江省
user022	66	    广东省
user023	1256	安徽省
user024	36.3	广东省
user025	54.89	广东省
user026	164.89	广东省
user027	45.78	广东省
user028	126.45	广东省
user029	47.35	河南省
user030	135.79	广东省
user031	159.23	广东省
user032	61.45	广东省
user033	110.41	广东省
user034	298.12	江苏省
user035	102.23	云南省
user036	70.59	上海
user037	159.87	广东省
user038	143.21	浙江省
user039	89.9	广东省
user040	49.9	浙江省
user041	52.3	山东省
user042	89.4	江西省
user043	59.21	北京
user044	37.77	广东省
user045	33.29	广东省
user046	36.19	贵州省
user047	159.9	福建省
user048	49.9	四川省
user049	45.6	广东省
user050	149.8	广东省

3 pie()函数说明

  • 实现这个功能,主要使用了matplotlibpyplot里的pie()函数;
  • pie()函数部分源码:
python 复制代码
# Autogenerated by boilerplate.py.  Do not edit as changes will be lost.
@_copy_docstring_and_deprecators(Axes.pie)
def pie(
        x, explode=None, labels=None, colors=None, autopct=None,
        pctdistance=0.6, shadow=False, labeldistance=1.1,
        startangle=0, radius=1, counterclock=True, wedgeprops=None,
        textprops=None, center=(0, 0), frame=False,
        rotatelabels=False, *, normalize=None, data=None):
    return gca().pie(
        x, explode=explode, labels=labels, colors=colors,
        autopct=autopct, pctdistance=pctdistance, shadow=shadow,
        labeldistance=labeldistance, startangle=startangle,
        radius=radius, counterclock=counterclock,
        wedgeprops=wedgeprops, textprops=textprops, center=center,
        frame=frame, rotatelabels=rotatelabels, normalize=normalize,
        **({"data": data} if data is not None else {}))
  • 参数说明:
参数 说明
x 绘图数据
explode 指定饼形图突出显示的部分
labels 饼形图标签说明
colors 饼形图的填充色
autopct 自动添加百分比显示
pctdistance 设置百分比标签与圆心的距离
shadow 是否添加饼形图的阴影效果
labeldistance 设置各扇形标签与圆心的距离
startangle 设置饼形图的初始摆放角度
radius 设置饼图的半径
counterclock 是否让饼图逆时针显示
wedgeprops 设置饼图内外边界的属性,如边界线粗细和颜色
textprops 设置饼图文本属性,如字体大小和颜色
center 饼图的中心点位置,默认原点
frame 是否显示饼形图后的图框

4 实现过程

4.1 导入包

python 复制代码
import pandas as pd
from matplotlib import pyplot as plt

4.2 定义一个类

  • 为了代码整洁和可读性,我们定义过一个类TestPie():
  • 类初始化:
python 复制代码
class TestPie():
    def __init__(self):
        super(TestPie, self).__init__()

4.3 读取数据并处理

python 复制代码
 # 读取数据
self.data_path = './data.xlsx'
self.data_content = pd.DataFrame(pd.read_excel(self.data_path))

# 获取地址信息
self.address = self.data_content['地址']
self.data_content['省'] = self.address

# 获取序号/地址/金额信息
self.content = self.data_content.groupby(['省'], as_index=False)["金额"].sum().reset_index()
# print(self.content)

# 降序排序
self.content01 = self.content.sort_values(['金额'], ascending=False)
self.content02 = self.content01.head(5)  # 读取前5行

4.4 定义饼图绘制方法

  • 定义方法:
python 复制代码
    def test_pic(self):
        """饼形图"""
  • 解决中文乱码问题:
python 复制代码
# 解决中文乱码
plt.rcParams['font.sans-serif'] = ['SimHei']
  • 设置饼图大小:
python 复制代码
# 调节图形大小
plt.figure(figsize=(3, 6))
  • 定义标签:
python 复制代码
labels = self.content02['省'].values.tolist()
  • 设置饼形图每块的值:
python 复制代码
sizes = self.content02['金额'].values.tolist()
  • 设置饼形图每块的颜色:
python 复制代码
colors = ['cyan','darkorange','lawngreen','pink','gold']
  • 饼图绘制:
python 复制代码
patches, l_text, p_text = plt.pie(sizes,
                labels=labels,
                colors=colors,
                labeldistance=1, 
                autopct='%.1f%%', 
                startangle=90,
                radius=0.5,
                center=(0.3, 0.3),
                textprops={'fontsize': 8, 'color': 'k'},
                pctdistance=0.7)
  • 设置图例,标题等:
python 复制代码
# 设置x,y轴刻度一致,这样饼图才能是圆的
plt.axis('equal')
plt.legend(loc='lower left', bbox_to_anchor=(-0.1, 0.8))
plt.title('购买力分析')

5 完整源码

python 复制代码
# -*- coding:utf-8 -*-
# 作者:虫无涯
# 日期:2023/11/15
# 文件名称:test_pie.py
# 作用:Matplotlib模块的pie()函数绘制饼形图
# 联系:VX(NoamaNelson)
# 博客:https://blog.csdn.net/NoamaNelson

import pandas as pd
from matplotlib import pyplot as plt


class TestPie():
    def __init__(self):
        super(TestPie, self).__init__()
        # 读取数据
        self.data_path = './data.xlsx'
        self.data_content = pd.DataFrame(pd.read_excel(self.data_path))

        # 获取地址信息
        self.address = self.data_content['地址']
        self.data_content['省'] = self.address

        # 获取序号/地址/金额信息
        self.content = self.data_content.groupby(['省'], as_index=False)["金额"].sum().reset_index()
        # print(self.content)

        # 降序排序
        self.content01 = self.content.sort_values(['金额'], ascending=False)
        self.content02 = self.content01.head(5)  # 读取前5行

    def test_pic(self):
        """饼形图"""
        # 解决中文乱码
        plt.rcParams['font.sans-serif'] = ['SimHei']

        # 调节图形大小
        plt.figure(figsize=(3, 6))
        # 定义标签
        labels = self.content02['省'].values.tolist()
        # 设置饼形图每块的值
        sizes = self.content02['金额'].values.tolist()
        # 设置饼形图每块的颜色
        colors = ['cyan', 'darkorange', 'lawngreen', 'pink', 'gold']

        patches, l_text, p_text = plt.pie(sizes,
                labels=labels, 
                colors=colors, 
                labeldistance=1, 
                autopct='%.1f%%',
                startangle=90, 
                radius=0.5, 
                center=(0.3, 0.3),
                textprops={'fontsize': 8, 'color': 'k'},
                pctdistance=0.7) 
                
        plt.axis('equal')
        # 显示图例
        plt.legend(loc='lower left', bbox_to_anchor=(-0.1, 0.8)

        # 添加图标题
        plt.title('购买力分析')
        plt.grid()
        plt.show()


if __name__ == "__main__":
    result = TestPie()
    result.test_pic()
  • 效果显示:
相关推荐
2501_944934731 天前
财务岗位如何在工作中提升数据分析能力?从财务分析到经营分析这样练
python·信息可视化·数据分析
2401_865439631 天前
CSS怎么在flex布局中实现项目均分间距_设置justify-content space-evenly
jvm·数据库·python
m0_493934531 天前
CSS如何实现输入框禁用样式_使用-disabled伪类设定
jvm·数据库·python
m0_716430071 天前
如何用 classList.toggle 实现侧边栏菜单的点击展开与收起
jvm·数据库·python
Destiny_where1 天前
Langgraph基础(4)-中断interrupt.实现图执行的动态暂停与外部交互
人工智能·python·langchain·langgraph
好家伙VCC1 天前
# 发散创新:用 Rust实现高性能物理引擎的底层架构设计与实战在游戏开发、虚拟仿真和机器人控
java·开发语言·python·rust·机器人
石榴树下的七彩鱼1 天前
图片去水印 API 哪个好?5种方案实测对比(附避坑指南 + 免费在线体验)
图像处理·人工智能·后端·python·api接口·图片去水印·电商自动化
liliangcsdn1 天前
多轮对话长上下文-向量检索和混合召回示例
开发语言·数据库·人工智能·python
leoZ2311 天前
金仓老旧项目改造-10
开发语言·前端·人工智能·python·金仓
weixin_580614001 天前
PHP源码运行受主板供电影响吗_供电相数重要性说明【技巧】
jvm·数据库·python