python数据可视化填充不规则图形(python可视化三seaborn单变量分析绘图)
在前面两篇文章中,我们已经学习了seaborn绘图的风格和颜色设置,从本篇文章开始,我们开始选一些有意思的数据集进行各种图形绘制,在实践中感受数据可视化的魅力。本篇文章主要讲2个绘图函数,那就是绘制直方图的函数seaborn,distplot()和绘制条形图的函数seaborn.barplot()(关于直方图和条形图的区别请查阅前面matplotlib系列中的相关文章)。
处理绘图数据今天我们用直方图和条形图展示下NBA2017-2018赛季各球员薪资情况。首先,我们用pandas把数据读写进来,然后按薪资情况降序排序,看下NBA球员中薪资前10的球员有哪些。
#导入需要的依赖包 %matplotlib inline import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns #读入数据 data=pd.read_csv('NBA_season1718_salary.csv') #对读进来的数据按薪资降序排序并取前10条数据 salary_top10=(data.sort_values("season17_18",ascending=False)).head(10) #取出球员列数据,作为条形图横坐标 player=salary_top10['Player'] #取出球员薪资列,作为条形图纵坐标 season_salary=salary_top10['season17_18']
前10条数据结构如下图:
前10球员薪资数据
用seaborn.barplot()绘制条形图用seaborn.barplot()函数可以绘制条形图,如果不传入任何参数,会绘制出一个坐标轴,如图:
sns.barplot()
使用默认参数绘图
现在,我们将球员数据作为横坐标,球员薪资作为纵坐标,绘制出条形图。
plt.figure(figsize=(10,6)) plt.xticks(rotation=45) plt.ylim(season.min() * 0.5, season.max() * 1.01) #ci参数表示允许的误差范围(控制误差棒的百分比,在0-100之间) sns.barplot(x=player,y=season,data=salary_top10,ci=68)
NBA球员薪资排名
从条形图中不难看出,勇士队的当家球星库里薪资最高,将近达到3500万美元,位居第二的是勒布朗詹姆斯,也是在3300万美元以上。上面的条形图是按球员作为横坐标,下面我们按球队汇总,看看哪个球队的薪资总额最高。
salary_by_team=data.groupby(by='Tm').sum().reset_index() salary_by_team=salary_by_team.sort_values(by='season17_18',ascending=False) tm_top10=salary_by_team[0:10] tm=tm_top10['Tm'] salary_sum=tm_top10['season17_18'] sns.barplot(tm,salary_sum,data=tm_top10) sns.color_palette('hls',10) sns.set(style="whitegrid")
NBA各球队薪资支付条形图
从上面条形图中可以看出勇士支付最高,其次是骑士!
seaborn.distplot()绘制直方图上面我们用条形图对比了各球员薪资排名和球队支付的薪资排名,接下来我们用直方图的方式展示整个联盟中各球员的薪资水平分布和球队薪资水平分布。
#用pandas读入数据 data=pd.read_csv('NBA_season1718_salary.csv') #取出薪资列 salary=data['season17_18'] #绘制直方图 sns.distplot(salary)
NBA球员2017-2018赛季薪资分布
上面这个图,我们没有指定bins,所以箱子数有点多,那我们分别指定bins为3,10,30,看看效果。
sns.distplot(salary,bins=3) sns.distplot(salary,bins=10) sns.distplot(salary,bins=30)
bins=3
bins=10
bins=30
对于上面的图,横坐标表示薪资范围,纵坐标表示每个球员薪资所占频数。下面我们汇总球队薪资,并绘制直方图。
#按球队汇总求和并重新设置index salary_by_team=data.groupby(by='Tm').sum().reset_index() #按薪资升序排序 salary_by_team=salary_by_team.sort_values(by='season17_18',ascending=False) tm_top10=salary_by_team[0:10] tm=tm_top10['Tm'] salary_sum=tm_top10['season17_18'] sns.distplot(salary_sum)
NBA各球队薪资分布图
这里默认分了2个范围,大家知道有30只球队,那么我们设置bins=30,看看效果:
sns.distplot(salary_sum,bins=30)
bins=30
可以从图中看出,大部分球队的薪资总额在1.2-1.3亿美元左右。下面我们对球队薪资总额进行处理,找出样本的上四分位、下四分位,并以此作为标准,将薪资总额分为3个等级(low:0、mid:1、high:2)。
#对球队薪资总额按降序顺序排序并重设索引 salary_by_team=salary_by_team.sort_values(by='season17_18',ascending=True).reset_index() #统计球队个数 cnt=salary_by_team['Tm'].count() Q3=int((3*(cnt 1)/4)) Q1=int(((cnt 1)/4)) #分别求出下四分位和上四分位,作为判断薪资水平的标准,低于下四分位的为低,高于上四分位的为高,中间为中等 Q1_value=salary_by_team.at[Q1,'season17_18'] Q3_value=salary_by_team.at[Q3,'season17_18']
然后,自定义一个分类函数,将薪资连续数值离散化:
def which_class(i): if i<Q1_value: return 0 elif i<Q3_value and i>Q1_value: return 1 else: return 2
然后用pandas的apply函数,处理连续值:
#新增level列,并将处理的值添加到新增列中 salary_by_team['level']=salary_by_team['season17_18'].apply(which_class)
处理结果
用等级数据绘制直方图:
sns.distplot(salary_by_team['level'])
薪资水平直方图
从图中可以发现,等级为1(中等)占的比重最大,这也是符合实际情况的,不可能所有的球队都像快船一样有钱!
好了,关于条形图和直方图到此为止,下次继续散点图绘制,感谢阅读。
,免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com