使用python画饼图-进阶版

 转载说明:如果您喜欢这篇文章并打算转载它,请私信作者取得授权。感谢您喜爱本文,请文明转载,谢谢。


在前面的文章《怎么用python给老板画个大饼?》中,探讨了如何使用python绘制饼图,但该文中的实验数据稍微有点简单,实际工作中的表单数据会更为复杂,今日我们一起来看看涉及稍微复杂一点的表单数据怎么绘制饼图吧!

场景1. 选择指定行数据绘制饼图

例子:Excel有3年的销售数据,只需要选择其中一年的数据绘制饼图:

图片

关键工具:

  • data.loc[]:用于选择要读取数据的指定行

代码+注释:

#!/usr/bin/env python 
# -*- coding: utf-8 -*-
# Time    : 2024/11/30 7:36
# File    : bingtu1.py
# Author  : SRE成长记
# Software: PyCharm
# ------------------------------
import pandas as pd
import matplotlib.pyplot as plt

# 解决中文显示问题:
plt.rcParams['font.sans-serif'] = ['STkaiti'] #指定默认字体
plt.rcParams['axes.unicode_minus'] =False  #解决保存图像是负号“-”,显示为方块的问题

# 读取数据
data0 = pd.DataFrame(pd.read_excel("SRE成长记四川特产销售额统计.xlsx","年度销售额"))
data = data0.loc[1]  #获取年度数据,从0开始,不包含表头行,这里0代表2021年数据行,1代表2022年数据行,3代表2023年数据行
year = data["年度"]  #获取画图选择的年度,用于在后面自动生成图表title和文件名
# print(data)

# 画饼图
labels = "香肠腊肉类","蜂蜜","红薯淀粉","蛋类"  #定义饼图每一个板块代表的标签含义,显示图例
colors = ['#0780cf','#765005','#fa6d1d','#0e2c82']  #逆时针的颜色约定,颜色码也可以换成颜色的英文单词、简称
sizes = [int(data["腊肉香肠类"]),int(data["蜂蜜"]),int(data["红薯淀粉"]),int(data["蛋类"])] #从excel读取数据
# print(sizes)

explode = (0.1,0.1,0.1,0.1)  #explode:爆炸,设置饼图每一个板块离开中心的距离。如果不设置,则默认是0,即每个板块就是紧紧相连
plt.pie(sizes, colors=colors, explode=explode, labels=labels, autopct='%1.1f%%',shadow=True, startangle=90,textprops={'fontsize':10,'color':'black'})
 # colors定义了每一个板块的颜色; %1.1f%%:保留一位小数点,添加百分号;startangle=90则从y轴正方向画起,textprops设置饼图中文字的大小、颜色
plt.axis('equal') # 将饼图显示为正圆形
plt.legend(loc="upper right",fontsize=10,bbox_to_anchor=[1,1],ncol=1,borderaxespad=0.3) # 定义图列样式
 # loc = 'upper right' 位于右上角
 # bbox_to_anchor=[0.5, 0.5] # 外边距 上边 右边
 # ncol=1 图列分1列,默认就是1,如果只需要1列展示,可以不设置这个参数
 # borderaxespad = 0.3图例的内边距

plt.text(1,-1,"制图:SRE成长记") #在某个指定的坐标位置加上文字说明
# plt.title("2023年四川特产销售图") #给饼图加上标题
# plt.savefig("2023年四川特产销售图-饼图.png",dpi=200,bbox_inches='tight') #dpi=200:指定分辨率
plt.title(f"{year}年四川特产销售图") #给饼图加上标题

plt.savefig(f"{year}年四川特产销售图-饼图.png",dpi=200,bbox_inches='tight') #dpi=200:指定分辨率
# plt.savefig()要放在plt.show()前面。原因:在 plt.show() 后调用了 plt.savefig() ,在 plt.show() 后实际上已经创建了一个新的空白的图片(坐标轴),这时候你再 plt.savefig() 就会保存这个新生成的空白图片。
plt.show() # 显示饼图窗口

上面的代码对比《怎么用python给老板画个大饼?》中,有2处改动:

1)增加了第16-17行,筛选想要的年度数据【必须】

第16行:data0 = pd.DataFrame(pd.read_excel("SRE成长记四川特产销售额统计.xlsx","年度销售额"))
第17行:data = data0.loc[1]  #获取年度数据,从0开始,不包含表头行,这里0代表2021年数据行,1代表2022年数据行,3代表2023年数据行

2)修改了title和图片文件名生成的方式,增加了变量【非必须】

第18行:year = data["年度"]  #获取画图选择的年度,用于在后面自动生成图表title和文件名

第36行:# plt.title("2023年四川特产销售图") #给饼图加上标题
第37行:# plt.savefig("2023年四川特产销售图-饼图.png",dpi=200,bbox_inches='tight') #dpi=200:指定分辨率
#将写死的年度“2023”换成 f"{year}变量
第38行:plt.title(f"{year}年四川特产销售图") #给饼图加上标题
第39行:plt.savefig(f"{year}年四川特产销售图-饼图.png",dpi=200,bbox_inches='tight') #dpi=200:指定分辨率

运行代码生成图片:

代码第17行如分别选择data = data0.loc[0] 、data = data0.loc[1] 、data = data0.loc[2] ,则是分别选择2021、2022、2023年数据生成饼图,保存到本地如下:

图片

场景2:选择指定列数据绘制饼图

例子:Excel有3年的销售数据,只需要选择其中一种商品的数据绘制近三年的销售额饼图:

图片

关键工具:

  • data0.filter(['年度','蜂蜜']):用于选择要读取数据的指定列
  • data.iloc[0,1]:读取指定单元格数据,获取饼图板块的数值

代码+注释:

#!/usr/bin/env python 
# -*- coding: utf-8 -*-
# Time    : 2024/12/1 7:14
# File    : bingtu2.py
# Author  : SRE成长记
# Software: PyCharm
# ------------------------------
import pandas as pd
import matplotlib.pyplot as plt

# 解决中文显示问题:
plt.rcParams['font.sans-serif'] = ['STkaiti'] #指定默认字体
plt.rcParams['axes.unicode_minus'] =False  #解决保存图像是负号“-”,显示为方块的问题

# 读取数据
data0 = pd.DataFrame(pd.read_excel("SRE成长记四川特产销售额统计.xlsx","年度销售额"))
data=data0.filter(['年度','蜂蜜'])  #根据表头列名称,筛选指定的列
# print(data)

# 画饼图
labels = "2021","2022","2023" #定义饼图每一个板块代表的标签含义,显示图例
colors = ['#0780cf','#765005','#fa6d1d']  #逆时针的颜色约定,颜色码也可以换成颜色的英文单词、简称
sizes = [int(data.iloc[0,1]),int(data.iloc[1,1]),int(data.iloc[2,1])] #从data中筛选2021、2022、2023年的蜂蜜数据,[]中第一个数字是筛选年度,第二个数字是筛选商品,课根据print(data)的结果对照看
# print(sizes)

explode = (0.1,0.1,0.1)  #explode:爆炸,设置饼图每一个板块离开中心的距离。如果不设置,则默认是0,即每个板块就是紧紧相连
plt.pie(sizes, colors=colors, explode=explode, labels=labels, autopct='%1.1f%%',shadow=True, startangle=90,textprops={'fontsize':10,'color':'black'})
 # colors定义了每一个板块的颜色; %1.1f%%:保留一位小数点,添加百分号;startangle=90则从y轴正方向画起,textprops设置饼图中文字的大小、颜色
plt.axis('equal') # 将饼图显示为正圆形
plt.legend(loc="upper right",fontsize=10,bbox_to_anchor=[1,1],ncol=1,borderaxespad=0.3) # 定义图列样式
 # loc = 'upper right' 位于右上角
 # bbox_to_anchor=[0.5, 0.5] # 外边距 上边 右边
 # ncol=1 图列分1列,默认就是1,如果只需要1列展示,可以不设置这个参数
 # borderaxespad = 0.3图例的内边距
 
plt.text(1,-1,"制图:SRE成长记") #在某个指定的坐标位置加上文字说明
# plt.title("历年蜂蜜特产销售图") #给饼图加上标题
plt.title("历年蜂蜜特产销售图") #给饼图加上标题

plt.savefig("历年蜂蜜特产销售图-饼图.png",dpi=200,bbox_inches='tight') #dpi=200:指定分辨率
# plt.savefig()要放在plt.show()前面。原因:在 plt.show() 后调用了 plt.savefig() ,在 plt.show() 后实际上已经创建了一个新的空白的图片(坐标轴),这时候你再 plt.savefig() 就会保存这个新生成的空白图片。
plt.show() # 显示饼图窗口

执行代码得到图片:

这就是根据表单,筛选指定的行、列数据做饼图的方法。如果既要指定行,又要指定列,又怎么绘制呢?

相关链接:使用python画饼图-入门

欢迎关注SRE成长记一起探讨学习!↓↓↓

<think>好的,用户想用Python读取Excel文件的G列数据画饼。首先,我需要确认用户的需求。他们可能需要处理数据,进行可视化分析,可能是为了展示某个分类数据的占比情况,比如销售分布、客户分类等。 接下来,考虑用户可能的背景。可能不太熟悉Python的相关库,所以需要详细步骤。需要用到pandas来读取Excel,可能还需要matplotlib或seaborn来绘。首先要确保他们安装了这些库,如果没有安装,需要提示他们安装。 然后,具体步骤分解。第一步是导入必要的库,比如pandas和matplotlib.pyplot。第二步是读取Excel文件,可能需要指定文件路径和sheet名称。这里要注意,用户可能需要处理不同的情况,比如文件路径是否正确,G列是否有数据,是否需要处理空值等潜在问题。 第三步是提取G列的数据使用pandas的iloc或直接列名来获取数据。假设G列的列名是已知的,比如“Category”,或者用户可能需要根据实际情况调整。如果列名未知,可能需要用df.columns[6]来获取,因为G列是第7列(索引6)。 接下来是数据处理。可能需要统计每个类别的出现次数,使用value_counts()方法。这样可以得到每个类别的数量,适合数据。需要确保数据中没有NaN值,或者如何处理这些缺失值,可能需要用户根据情况处理,比如过滤掉或填充默认值。 然后是绘制使用matplotlib的pie函数。这里需要注意设置参数,比如autopct显示百分比,startangle调整起始角度,添加标题,可能还需要调整形大小,或者是否显示例。如果类别较多,可能需要调整标签的显示方式,避免重叠。 最后,保存图表或显示出来。用户可能希望保存为片文件,或者直接在Jupyter Notebook中查看。需要给出plt.show()和plt.savefig()两种选项,并解释用法。 可能遇到的问题:文件路径错误,G列不存在,数据中有非文本类别需要处理,类别过多导致不清晰。这时候可能需要提示用户检查数据,或者建议使用条形如果类别太多。 另外,需要提醒用户安装库的命令,比如pip install pandas openpyxl matplotlib,因为读取Excel可能需要openpyxl引擎,特别是.xlsx文件。 总结回答的结构应该是逐步指导,代码示例,并解释每个步骤的作用。同时,指出可能的常见问题和解决方法,让用户能够自行排查错误。</think>以下是用Python读取Excel文件并绘制的逐步教程: 1️⃣ 首先安装所需库(若未安装) ```bash pip install pandas openpyxl matplotlib ``` 2️⃣ 完整代码示例: ```python import pandas as pd import matplotlib.pyplot as plt # 读取Excel文件(修改为你的实际路径) file_path = "你的文件.xlsx" df = pd.read_excel(file_path, engine='openpyxl') # 读取整个文件 # 提取G列数据(两种方式任选其一) # 方式1:按列索引(G列是第7列,索引从0开始) g_data = df.iloc[:, 6] # 方式2:按列名(需替换为实际列名) # g_data = df["你的列名"] # 统计各分类出现次数 value_counts = g_data.value_counts() # 创建 plt.figure(figsize=(8, 8)) # 设置形大小 plt.pie(value_counts, labels=value_counts.index, autopct='%1.1f%%', # 显示百分比 startangle=90, # 起始角度 textprops={'fontsize': 12}) plt.title("G列数据分布", fontsize=15, pad=20) # 设置标题 plt.axis('equal') # 保证圆形 # 显示形 plt.show() # 保存片(可选) # plt.savefig('pie_chart.png', dpi=300, bbox_inches='tight') ``` 3️⃣ 关键步骤说明: - `engine='openpyxl'`:处理.xlsx文件必须的参数 - `value_counts()`:自动统计不同值的出现次数 - `autopct`:控制百分比显示格式(例如`%.2f%%`显示两位小数) - `startangle`:可调整起始旋转角度 ❗ 常见问题处理: 1. 文件路径错误 → 检查文件路径是否包含中文/特殊字符 2. 出现NaN值 → 在读取数据后添加:`g_data = g_data.dropna()` 3. 中文显示乱码 → 在代码开头添加: ```python plt.rcParams['font.sans-serif'] = ['SimHei'] # 设置中文字体 plt.rcParams['axes.unicode_minus'] = False # 解决负号显示问题 ``` 💡 进阶调整建议: - 突出显示某部分 → 添加`explode`参数 - 自定义颜色 → 使用`colors`参数传入颜色列表 - 类别过多时 → 合并小类别为"其他"(可用`groupby`处理) 示例效果:将会生成一个显示各分类占比的,自动计算百分比,默认从12点方向开始顺时针分布。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值