数据结构论坛

注册

 

发新话题 回复该主题

python可视化三seaborn单 [复制链接]

1#
北京治疗白癜风最好的医院 http://www.pfzhiliao.com/

在前面两篇文章中,我们已经学习了seaborn绘图的风格和颜色设置,从本篇文章开始,我们开始选一些有意思的数据集进行各种图形绘制,在实践中感受数据可视化的魅力。本篇文章主要讲2个绘图函数,那就是绘制直方图的函数seaborn,distplot()和绘制条形图的函数seaborn.barplot()(关于直方图和条形图的区别请查阅前面matplotlib系列中的相关文章)。

处理绘图数据

今天我们用直方图和条形图展示下NBA-赛季各球员薪资情况。首先,我们用pandas把数据读写进来,然后按薪资情况降序排序,看下NBA球员中薪资前10的球员有哪些。

#导入需要的依赖包%matplotlibinlineimportnumpyasnpimportpandasaspdimportmatplotlib.pyplotaspltimportseabornassns#读入数据data=pd.read_csv(NBA_season_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-之间)sns.barplot(x=player,y=season,data=salary_top10,ci=68)

NBA球员薪资排名

从条形图中不难看出,勇士队的当家球星库里薪资最高,将近达到万美元,位居第二的是勒布朗詹姆斯,也是在万美元以上。上面的条形图是按球员作为横坐标,下面我们按球队汇总,看看哪个球队的薪资总额最高。

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_season_salary.csv)#取出薪资列salary=data[season17_18]#绘制直方图sns.distplot(salary)

NBA球员-赛季薪资分布

上面这个图,我们没有指定bins,所以箱子数有点多,那我们分别指定bins为3,10,30,看看效果。

sns.distplot(salary,bins=3)sns.distplot(salary,bins=10)sns.distplot(salary,bins=30)

bins=3bins=10bins=30

对于上面的图,横坐标表示薪资范围,纵坐标表示每个球员薪资所占频数。下面我们汇总球队薪资,并绘制直方图。

#按球队汇总求和并重新设置indexsalary_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]然后,自定义一个分类函数,将薪资连续数值离散化:

defwhich_class(i):ifiQ1_value:return0elifiQ3_valueandiQ1_value:return1else:return2然后用pandas的apply函数,处理连续值:#新增level列,并将处理的值添加到新增列中

salary_by_team[level]=salary_by_team[season17_18].apply(which_class)

处理结果

#用等级数据绘制直方图:sns.distplot(salary_by_team[level])

薪资水平直方图

从图中可以发现,等级为1(中等)占的比重最大,这也是符合实际情况的,不可能所有的球队都像快船一样有钱!好了,关于条形图和直方图到此为止,下次继续散点图绘制,感谢阅读。

分享 转发
TOP
发新话题 回复该主题