转载说明:如果您喜欢这篇文章并打算转载它,请私信作者取得授权。感谢您喜爱本文,请文明转载,谢谢。
在前面的文章《怎么用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成长记一起探讨学习!↓↓↓