在上篇文章中(
python数据可视化(四)seaborn回归分析绘图(regplot)
)中,我们讨论了绘制两个变量之间关系的函数用法,但是大家有没有发现,上篇文章中,我们分析消费总额和小费、用餐人数和小费之间的关系时没有区分性别,也没有区分用餐时间,为什么呢?因为regplot()函数没有hue这个参数,如果要根据类别绘制,大家可以去官网查看lmplot()函数的用法,而本篇文章我们用几个函数实现带有分类属性图形的绘制。
seaborn.jointplot(x,y)
这个函数会用直方图(单变量)和散点图(带分类属性多变量)同时展示数据的分布,我们先绘制出图形,然后根据图形分析。
#导入依赖包
%matplotlib inline
import matplotlib.pyplot as plt
import seaborn as sns
sns.set(style="whitegrid", color_codes=True)
tips = sns.load_dataset("tips")
这里我们还是先看下数据集特征变量。如图:
数据预览
total_bill是消费总金额,tip是小费,size指用餐人数。现在我们用seaborn.jointplot()函数绘制出消费总金额和
小费
之间的关系。
sns.jointplot(x='total_bill',y='tip',data=tips)
total_bill与tip的jointplot()
首先,我们分析这个函数绘出的图形组成,可以看到此图形由散点图和直方图两部分组成,散点图反应了消费总额和小费之间的数据分布,直方图反应了单个变量(如小费或者消费总金额)的数据分布。为了更好的验证,这里我们用seaborn提供的直方图函数和散点图函数单独绘制,并与jointplot做一个对比,首先我们绘制出total_bill和tip的直方图,如下:
sns.distplot(tips['total_bill'])
sns.distplot(tips['tip'])
total_bill直方图
tip直方图
可以看到,total_bill直方图对应jointplot中上侧直方图,tip直方图对应jointplot中右侧直方图。验证了直方图,那我们再将total_bill和tip的散点图单独绘制出来,
sns.scatterplot(x='total_bill',y='tip',data=tips)
total_bill与tip散点图
可以看到,total_bill与tip散点图和jointplot中的散点图分布一致,这也就间接的说明,jointplot()这个函数可以同时绘制出distplot和scatterplot这两个函数绘制的图形。相信通过上面的几个例子,大家都知道了jointplot()函数的功能就是joint了distplot和scatterplot,那么接下来,我们在看看这个函数的其他几个参数的用法。首先看看kind这个参数,这个参数能够指定绘制图形的类型,可选值有scatter 、 reg 、resid 、kde 、 hex,默认是scatter。那我们直接指定不同类型,看看绘图效果。
#回归类型
sns.jointplot(x='total_bill',y='tip',data=tips,kind='reg')
kind=reg
#右侧回归
sns.jointplot(x='total_bill',y='tip',data=tips,kind='resid')
kind=resid
sns.jointplot(x='total_bill',y='tip',data=tips,kind='hex')
kind=hex
seaborn.stripplot()
jointplot函数反应了两个变量之间的数据分布关系,但是没有反应出分类数据的分布,就像上图中我们只是看到了消费总金额和小费之间的关系,但是无法看出不同性别数据对应的消费金额和小费之间的关系,因此,seaborn提供了stripplot()函数来反应分类数据的散点图。这个函数没有必填参数,如果不传任何参数,只会绘制出一个图形模板。如下:
sns.stripplot()
stripplot全部默认参数绘图效果
现在,我们给stripplot传消费金额和小费数据,看看效果:
sns.stripplot(x='total_bill',y='tip',data=tips)
以total_bill为分类数
从上面的图中可以看到,stripplot参数中的x是横轴数据(分类数据),y是纵轴数据(类型对应数据),由于我们将总金额作为分类,导致分类太多,横轴数据根本看不清,所以我们重新传参,分别看下性别和小费、时间和小费,用餐日期跟小费之间的数据分布。
sns.stripplot(x='sex',y='tip',data=tips)
不同性别对应小费数据分布
sns.stripplot(x="day", y="tip", data=tips);
不同日期对应小费数据分布
sns.stripplot(x="time", y="tip", data=tips);
用餐时间对应小费数据分布
sns.stripplot(x="smoker", y="tip", data=tips);
吸烟者与不吸烟给的小费数据分布
从上面几个图中大致可以看出,最高小费出现在男性吸烟人群中,用餐人数最多的是在周六。通过观察上面几个图,大家可能发现数据分布是一个带状,而不是条状,按道理肯定有很多小相同的数据,表现在图上就是数据重叠,但上面几个图好像展示的很好,那是因为jitter(数据抖动)这个参数的默认值是True,如果我们将其设置为False,效果如图:
sns.stripplot(x="day", y="tip",jitter=False, data=tips);
jitter=False
分布散点图函数有了jitter这个参数,好像已经足够好的展示了数据的分布(抖动后还是有相同数据),但事实上还有比这分布散点图更明晰的函数,那就是分簇散点图。
seaborn.swarmplot()
swarmplot函数的功能和stripplot功能类似,能够绘制分类数据散点图,但是这个散点图没有重叠。我们直接传入数据看效果:
sns.swarmplot(x="day", y="tip", data=tips)
分簇散点图
可以看到,这个图就像是一棵松树,相同的数据在一个枝丫上,很有层次感,看了很舒服,而且可以根据数的宽度判断相同数据的规模,比如小费金额为2刀的数据很多,树显得很宽,这也符合社会现实,大部分是中等收入的,所以出手也不会很阔绰。同时,“土豪”和“屌丝”占很小的比例。言归正传,在stripplot函数中,我们只看了某一类别对应的数据,而没有看类中对应其他类的数据分布,举个例子,比如我们用stripplot看到男性和女性对应的小费数据,但是不知道男性和女性对应的数据中哪些是吸烟的,哪些是不吸烟的,对于这个问题这两个函数都有一个hue参数,这里我们就以分簇散点图函数为例,演示下这个参数的效果,如图:
sns.swarmplot(x="day", y="tip", hue="sex",data=tips)
hue=sex
上面这个图就很好的展示了不同性别在不同的星期中付小费数据的分布。由于swarmplot函数和stripplot函数很相似,这里就不做太多介绍,因为后面的小提琴图、箱线图中还会用到这个函数,今天的内容就到这里,感谢阅读和关注!