飞桨深度学习学院-Python小白逆袭大神Day(3)笔记

Day3-《青春有你2》选手数据分析

作业:请在下方提示位置,补充代码,对《青春有你2》对选手体重分布进行可视化,绘制饼状图,如下图所示:

作业结果

作业代码如下:

import matplotlib.pyplot as plt
import numpy as np 
import json
import matplotlib.font_manager as font_manager
import pandas as pd

#显示matplotlib生成的图形
%matplotlib inline
df = pd.read_json('data/data31557/20200422.json')
#print(df)
df["weight_num"] = df["weight"].map(lambda x:float(x[:-2]))
labels = ['<45kg','45~50kg','50~55kg','>55kg']
explode = (0.05,0,0,0)
# 设置显示中文
plt.rcParams['font.sans-serif'] = ['SimHei'] # 指定默认字体
plt.figure(figsize=(12,9))
plt.pie(x = pd.cut(df["weight_num"], bins=listBins, labels=labels).value_counts(), # 绘图数据
labels=labels, # 添加标签
autopct='%.1f%%', # 设置百分比的格式,这里保留一位小数
explode=explode,
startangle=90,
textprops ={'fontsize':14,'color':'black'},
labeldistance=1.05)
plt.axis('equal')   #该行代码使饼图长宽相等
# plt.legend()
plt.title('''《青春有你2》参赛选手''',fontsize = 24)
plt.savefig('/home/aistudio/work/result/pie_result03.jpg')
plt.show()

输出结果:
代码输出结果

代码详解

步骤一

分别获取体重为[’<45kg’,‘45-50kg’,‘50~55kg’,’>55kg’]这四个区间的人数。代码如下:

df["weight_num"] = df["weight"].map(lambda x:float(x[:-2]))
labels = ['<45kg','45~50kg','50~55kg','>55kg']
explode = (0.05,0,0,0)
x = pd.cut(df["weight_num"], bins=listBins, labels=labels).value_counts()

第一行代码:
由于获取到的df[“weight”]是‘object’类型,无法使用大小来衡量,所以需要对该字符串进行切片,不要最后的kg即可。其中使用到了map(),与lambda。map是对每一个元素进行相同的操作,lambda是对字符串进行切片操作,切片得到的依旧是字符串,因此需要使用float()来将体重转换为数值型(不能使用int,因为有部分体重是带有小数点)
第二行代码:
labels定义了最后饼图的标签以及后边pandas.cut()会用到
第三行代码:
explode定义了pandas.cut()的切分间隔
第四行代码
主要是对pandas.cut(),这个函数的具体使用方法可以参考以下官方链接:
链接: http://pandas.pydata.org/pandasdocs/stable/generated/pandas.cut.html

pandas.cut(x, bins, right=True, labels=None, retbins=False, precision=3, include_lowest=False, duplicates='raise') #0.23.4

x:被切分的类数组(array-like)数据,必须是1维的(不能用DataFrame);

bins:bins是被切割后的区间(或者叫“桶”、“箱”、“面元”),有3中形式:一个int型的标量、标量序列(数组)或者pandas.IntervalIndex 。一个int型的标量. 当bins为一个int型的标量时,代表将x平分成bins份。x的范围在每侧扩展0.1%,以包括x的最大值和最小值。标量序列. 标量序列定义了被分割后每一个bin的区间边缘,此时x没有扩 .pandas.IntervalIndex
定义要使用的精确区间。

right:bool型参数,默认为True,表示是否包含区间右部。比如如果bins=[1,2,3],right=True,则区间为(1,2],(2,3];right=False,则区间为(1,2),(2,3)。

labels:给分割后的bins打标签,比如把年龄x分割成年龄段bins后,可以给年龄段打上诸如青年、中年的标签。labels的长度必须和划分后的区间长度相等,比如bins=[1,2,3],划分后有2个区间(1,2],(2,3],则labels的长度必须为2。如果指定labels=False,则返回x中的数据在第几个bin中(从0开始)。

retbins:bool型的参数,表示是否将分割后的bins返回,当bins为一个int型的标量时比较有用,这样可以得到划分后的区间,默认为False。

precision:保留区间小数点的位数,默认为3.

include_lowest:bool型的参数,表示区间的左边是开还是闭的,默认为false,也就是不包含区间左部(闭)duplicates:是否允许重复区间。有两种选择:raise:不允许,drop:允许。

步骤二

绘制饼图

plt.figure(figsize=(12,9))# 设置图片大小
plt.pie(x = pd.cut(df["weight_num"], bins=listBins, labels=labels).value_counts(), # 绘图数据
labels=labels, # 添加标签
autopct='%.1f%%', # 设置百分比的格式,这里保留一位小数
explode=explode,
startangle=90,
textprops ={'fontsize':14,'color':'black'},
labeldistance=1.05)
plt.axis('equal')   #该行代码使饼图长宽相等
# plt.legend()
plt.title('''《青春有你2》参赛选手''',fontsize = 24)
plt.savefig('/home/aistudio/work/result/pie_result03.jpg')
plt.show()

其中主要是plt.pie()的使用。
官方链接为:
http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.pie

matplotlib.pyplot.pie(x, explode=None, labels=None, colors=None, autopct=None, pctdistance=0.6, shadow=False, labeldistance=1.1, startangle=None, radius=None, counterclock=True, wedgeprops=None, textprops=None, center=(0, 0), frame=False, hold=None, data=None)

x : array-like
explode : array-like, optional, default: None(设置饼图偏离)
labels : list, optional, default: None(标签)
colors : array-like, optional, default: None(颜色设置)
autopct : None (default), string, or function, optional(设置百分比显示)
pctdistance : float, optional, default: 0.6(百分比距圆心的位置)
shadow : bool, optional, default: False(设置阴影)
labeldistance : float, optional, default: 1.1(标签距圆心的距离)
startangle : float, optional, default: None(开始位置的旋转角度,第一个分类是在右45度位置)
radius : float, optional, default: None(设置半径的大小)
counterclock : bool, optional, default: True
wedgeprops : dict, optional, default: None
textprops : dict, optional, default: None(设置标签字体大小等)
center : list of float, optional, default: (0, 0)(设置中心位置)
frame : bool, optional, default: False
本次作业中主要使用了labels来添加标签;autopct=’%.1f%%’ 设置百分比的格式,这里保留一位小数;explode=explode设置饼图偏离的距离;startangle=90开始位置的旋转角度为90;textprops{‘fontsize’:14,‘color’:‘black’}标签字体设置;labeldistance=1.05标签距离圆心的位置;
最后使用plt.show()完成作业即可。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值