首先,导入我们的工具包,并执行魔法指令:
import numpy as np
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
sns.set_style("whitegrid")
在开始正题之前,我们来解决一个可能普遍存在的问题,sns.load_dataset
可能在导入数据集时报错。
首先我们需要找到 seaborn-data
文件夹在电脑中的位置:
如果目录下没有这些文件,那么加载数据集可能会报错。如果该目录下没有文件,我们去 github
下载下来,放进去就好了。
Github 下载网址:https://github.com/mwaskom/seaborn-data 。
下载完成后,将其中的 csv
文件拷贝到 seaborn-data
目录下即可。
stripplot
stripplot
可以绘制多个离散值变量的分析图,并且自动添加抖动,以解决数据重叠。
接下来,导入今天的第一个数据集 tips
:
tips = sns.load_dataset("tips")
tips.head()
该数据集是关于餐厅顾客小费打赏的数据:
使用 stripplot
绘制出不同 day
,顾客小费的打赏情况:
sns.stripplot(x="day", y="total_bill", data=tips)
分析结果:
还可以再填一个分类的变量:hue='sex'
,不仅可以绘制出不同日期的消费打赏分布,并且在绘制时还会按照性别进行区分:
sns.stripplot(x="day", y="total_bill", hue='sex', data=tips)
分析结果:
swarmplot
stripplot
解决数据重叠时虽然加了抖动,但在数据量比较大的时候,还是会有很多数据重叠在一起,从而影响到我们观察分布的数据量。
为此,swarmplot
提出了更友好的解决方式:
sns.swarmplot(x="day", y="total_bill", data=tips)
其用法与 stripplot
相同,但绘制结果更清晰,会将数据展开成树枝的形状:
同样,在绘制时也可以分性别进行展示:
sns.swarmplot(x="day", y="total_bill", hue="sex", data=tips)
绘制结果:
我们可以发现,周四、周六和周日打赏小费的顾客较多,金额多集中在 10~20 之间,周末打赏小费的金额不变会比较高,而且男性居多。
boxplot 与 violinplot
盒图不仅可以直观地反应数据的分布,还标出了中位数、 1/4 分位、3/4 分位以及离群点。
sns.boxplot(x="day", y="total_bill", hue="sex", data=tips)
绘制结果:
每组数据中,都按照性别的不同绘制除了 1 对儿盒图。当然,也可以使用小提琴图来描述上述数据特征的分布:
sns.violinplot(x="day", y="total_bill", hue="sex", data=tips)
小提琴图的高矮胖瘦向我们直观反映了数据的分散和集中情况:
由于小提琴图是由对称的两部分组成的,因此也可以只绘制出一半。这样就可以将不同性别的数据绘制在一个小提琴上:
sns.violinplot(x="day", y="total_bill", hue="sex", data=tips, split=True)
绘制结果:
还可以将小提琴与 swarmplot
叠加使用:
sns.violinplot(x="day", y="total_bill", data=tips, inner=None)
sns.swarmplot(x="day", y="total_bill", data=tips, color="w", alpha=0.6)
这样在小提琴中就可以看到数据的点啦~小提琴越胖的位置,其实就是我们数据分布越集中的区域:
barplot 与 pointplot
下面,导入今天的第二个数据集:
titanic = sns.load_dataset("titanic")
titanic.head()
没错,是我们熟悉的泰坦尼克号获救信息统计结果:
下面,假设我们希望分性别对比不同船舱等级的获救情况:
sns.barplot(x="class", y="survived", hue="sex", data=titanic)
sns.barplot
用于绘制柱形图,柱形图可以直观地对数据的大小进行对比:
使用折线图,可以直观地反应数据的变化趋势。Seaborn
绘制折线图使用 pointplot
,可以直观反映出获救随船舱等级变化的情况:
sns.pointplot(x="class", y="survived", hue="sex", data=titanic)
绘制结果: