pandas绘制饼图

绘制饼图需要用到matplotlib包,

这是我使用的数据,里面记录了关于学生id,name,,age,gender,clazz信息的数据

题目要求按照每个班级男生女生比例绘制饼图

前置工作是提取出需要的信息,那就是标签,与及需要我们计算的数据

这个题目里面需要的就是班级+性别 作为数据的标签,具体的数据就是每个班级的男生女生的人数

先 根据班级和性别分组,再count每个分类中数据有多少条

clazz_gender_stu=stu.groupby(['clazz','gender'])['id'].count().reset_index().rename(columns={'id':'count'})
clazz_gender_stu

 

拼接班级和性别作为标签(labels)

clazz_gender_labels=clazz_gender_stu['clazz']+'-'+clazz_gender_stu['gender']

 

 准备工作,先导包和消除中文乱码

import matplotlib.pyplot as plt

# windows解决中文乱码
plt.rcParams['font.sans-serif']=['SimHei'] # 用来正常显示中文标签

# mac解决中文乱码
# plt.rcParams['font.sans-serif'] = ['Arial Unicode MS']

plt.rcParams['axes.unicode_minus']=False # 用来正常显示负号

绘制饼图: 

#设置画布的大小
plt.figure(figsize=(10,10))
#第一个传入的是我们需要计算的数据,
plt.pie(clazz_gender_stu['count'],
       #labels是传入标签的
       labels=clazz_gender_labels.values,    
       # 格式化输出百分比
       autopct='%.2f%%' 
       )
#绘图的标题
plt.title('班级的性别比例')
#关闭运行日志
plt.show()

图虽然画出来了,但是看起来怪怪的

我们其实有更好的选择,就是分割画布,每个区域显示出每个班级的比例图

分割画布,绘制子图: 

#设置画布的大小
plt.figure(figsize=(16,10))

#分割画布,将画布划分为3行4列,现在所处的位置是第一块
plt.subplot(3,4,1)
plt.title('文科一班的性别比例')
#因为现在按照每个班级算人数,我筛选出每个班级的表数据作为新表传入绘图参数
clazz1=clazz_gender_stu[clazz_gender_stu['clazz']=='文科一班']
plt.pie(clazz1['count'],labels=clazz1['gender'],autopct='%.2f%%')

#这是画布的第二块
plt.subplot(3,4,2)
plt.title('文科二班的性别比例')
clazz1=clazz_gender_stu[clazz_gender_stu['clazz']=='文科二班']
plt.pie(clazz1['count'],labels=clazz1['gender'],autopct='%.2f%%')

#这是画布的第十二块,也是最后一块
plt.subplot(3,4,12)
plt.title('理科六班的性别比例')
clazz1=clazz_gender_stu[clazz_gender_stu['clazz']=='理科六班']
plt.pie(clazz1['count'],labels=clazz1['gender'],autopct='%.2f%%')

plt.show()

上面的写的太多重复步骤,我这里用循环改进成最终版

plt.figure(figsize=(16,10))
#设置了i后面一次循环结束就加一,可以对应画布上的位置
i=1
#clazz_gender_stu是我的数据表,我筛选出这单独一列,然后用unique()方法去重
for clazz in clazz_gender_stu.clazz.unique(): 
    plt.subplot(3,4,i)
    plt.title('%s的性别比例' % clazz)
    clazz1=clazz_gender_stu[clazz_gender_stu['clazz']==clazz]
    plt.pie(clazz1['count'],labels=clazz1['gender'],autopct='%.2f%%'
    i+=1

 

 其实绘图的颜色也是可选的,饼图的颜色参数有很多种,我选了2个在下面

 colors=["#19CAAD, "#E6CEAC"]

感兴趣的可以去搜一搜RGB颜色参数

我们也可以看出规律,这是由一个#加上16进制里面对应的16个值组合在一块形成了一个颜色参数,所以可以考虑自动生成

随机生成要先import random包,random下的choice方法会从我们设置的参数里随机挑选一个,所以循环6次,我们还得拼一个#在颜色参数得前面,后面的循环是根据你要几个颜色调整,这就可以使用了,不做演示

colors=["#"+"".join([random.choice('0123456789ABCDEF') for i in range(6)]) for j in range(2)])

  • 3
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值