- Categorical scatterplots
- Distributions of observations within categories
- Statistical estimation within categories
- Plotting “wide-form” data
- Showing multiple relationships with facets
有关分类变量的绘制
当你想展示的变量中其中有一个分类变量,则可以用本篇里面的函数进行绘制图形。
Categorical scatterplots:
stripplot()(with parameter “kind=’strip’; default”)swarmplot()(with parameter “kind=’swarm’”)
Categorical distribution plots:
boxplot()(with parameter “kind=’box’”)violinplot()(with parameter “kind=’violin’”)boxenplot()(with parameter “kind=’boxen’”)
Categorical estimate plots:
pointplot()(with parameter “kind=’point’”)barplot()(with parameter “kind=’bar’”)countplot()(with parameter “kind=’count’”)
接下来,导入本节需要用的包,数据集部分参考我的上一篇博客: Seaborn——Visualizing statistical relationship
import seaborn as sns
import matplotlib.pyplot as plt
sns.set(style='ticks', color_codes=True)
Categorical scatterplots
函数catplot()默认的图表类型是散点图。散点图一般有两种类型:stripplot()(条状散点图)以及swarmplot()(蜂群散点图)
tips = sns.load_dataset("tips")
sns.catplot(x="day", y="total_bill", data=tips)
结果如下图所示:

其中,参数“jitter”控制jitter的程度或者完全禁用:
sns.catplot(x="day", y="total_bill", jitter=False, data=tips)
结果如下图所示:

第二种方法是防止它们重叠的算法来调整沿分类轴的点。它能更好的表示观测值的分布,但它只适合较小的数据集。这个类型的函数在函数catplot()中通过参数“kind=swarm”来激活:
sns.catplot(x="day", y="total_bill", kind="swarm", data=tips)
结果如下图所示:

和上篇博客中一样,可以增加参数“hue”再增加一个变量进行观察:
sns.catplot(x="day", y="total_bill", hue="sex", kind="swarm", data=tips)
结果如下图所示:

Seaborn中对于分类变量会尽量推断类别的顺序,来进行排序:
sns.catplot(x="size", y="total_bill", kind="swarm", data=tips.query("size != 3"))
结果如下图所示:

除了默认顺序还可以使用order参数在特定于绘图的基础上控制排序。在同一个图中绘制多个分类图这个参数将非常重要:
sns.catplot(x="smoker", y="tip", order=["No", "Yes"], data=tips)
结果如下图所示:

当分类变量的名称较长或者类别较多时,可以将散点图的横纵坐标转置一下:
sns.catplot(x="total_bill", y="day", hue="time", kind="swarm", data=tips)
结果如下图所示:

Distributions of observations within categories
当数据集大小增加时,分类散点图可以提供的信息变得有限,下面提供集中方法可以方便地在类别层次上进行比较。
Boxplots
首先是箱线图(Boxplot),其中显示了三个四分位值和极值,以及离群值。
sns.catplot(x="day", y="total_bill", kind="box", data=tips)
结果如下图所示:

在上述基础上同样可以增加参数“hue”,
sns.catplot(x="day", y="total_bill", hue="smoker", kind="box", data=tips)
结果如下图所示:

当hue参数值的分类变量与x轴的分类变量有关时,这时会出现一部分箱线图在左,一部分箱线图在右:
tips["weekend"] = tips["day"].isin(["Sat", "Sun"])
sns.catplot(x="day", y="total_bill", hue="weekend", kind="box", data=tips)
结果如下图所示:

我们发现这个图很丑,所以可以通过将参数“dodge”设置为False就可避免这种情况。
tips["weekend"] = tips["day"].isin(["Sat", "Sun"])
sns.catplot(x="day", y="total_bill", hue="weekend",
kind="box", dodge=False, data=tips)
结果如下图所示:

另一个很类似于箱线图的图boxenplot(),这个相比于箱线图能够显示更多的信息,我们可以通过这个图看到数据集的分布,因此这个图适合更大的数据集。
diamonds = sns.load_dataset("diamonds")
sns.catplot(x="color", y="price", kind="boxen",
data=diamonds.sort_values("color"))
结果如下图所示:

Violinplots
另一种方法就是violinplot(),它时结合了boxplot和kernel density estimation两种图,因此它能够展示更多的信息:
sns.catplot(x="total_bill", y="day", hue="time",
kind="violin", data=tips)
结果如下图所示:

这种方法使用KDE来提供更丰富的值分布描述,缺点是需要调整其他参数:
sns.catplot(x="total_bill", y="day", hue="time",
kind="violin", bw=.15, cut=0, data=tips)
结果如下图所示:

由于violinplot中左右对称,所以在进行对比时,为了表示的更加明显,可以将两个对比的图各取一半放在一起,这样可以更加节省位置,并且能够更加明显的对比两个数据:
sns.catplot(x="day", y="total_bill", hue="sex",
kind="violin", split=True, data=tips)
结果如下图所示:

最后,violinplot还有一个选项,显示每个单独观察结果的方法,这种适合小量的数据集,数据集过大就失去了它的意义:
sns.catplot(x="day", y="total_bill", hue="sex",
kind="violin", inner="stick", split=True,
palette="pastel", data=tips)
结果如下图所示:

它还能够结合swarmplot()(蜂群图)或stripplot():
g = sns.catplot(x="day", y="total_bill", kind="violin", inner=None, data=tips)
sns.swarmplot(x="day", y="total_bill", color="k", size=3, data=tips, ax=g.ax)
结果如下图所示:

g = sns.catplot(x="day", y="total_bill", kind="violin", inner=None, data=tips)
sns.stripplot(x="day", y="total_bill", color="k", size=3, data=tips, ax=g.ax)
结果如下图所示:

Statistical estimation within categories
当不想显示每个类别中的分布而是想要知道中心趋势的估计值,可以用下面的方法。
Bar plots
其中一个方法就是Barplot,barplot()函数对完整的数据集进行操作,并应用一个函数来获取估计值(默认取平均值)。当每个类别中有多个观测值时,它还使用bootstrapping计算估计值周围的置信区间,并使用误差条绘制:
titanic = sns.load_dataset("titanic")
sns.catplot(x="sex", y="survived", hue="class", kind="bar", data=titanic)
结果如下图所示:

当你只想显示每个类别的观测数量,而非统计值时,可以使用函数countplot()。(这类似于分类变量而不是数值变量上的直方图)
sns.catplot(x="deck", kind="count", palette="ch:.25", data=titanic);
结果如下图所示:

可以通过之前讲过的函数调用barplot()以及countplot():
sns.catplot(y="deck", hue="class", kind="count",
palette="pastel", edgecolor=".6", data=titanic)
结果如下图所示:

Point plots
函数pointplot()提供了另一种可视化相同信息的样式。该函数还用另一个轴上的高度来显示估计值,而不是显示一个完整的条,它绘制了点估计和置信区间。另外,pointplot()连接来自同一色调类别的点。这使得我们很容易看出主关系是如何随着色调语义的变化而变化的。
sns.catplot(x="sex", y="survived", hue="class", kind="point", data=titanic)
结果如下图所示:

更改样式:
sns.catplot(x="class", y="survived", hue="sex",
palette={"male": "g", "female": "m"},
markers=["^", "o"], linestyles=["-", "--"],
kind="point", data=titanic)
结果如下图所示:

Plotting “wide-form” data
我们可以将boxplot整个图横置过来(当你的数据更适合横向放置时),通过参数orient来进行设置:
iris = sns.load_dataset("iris")
sns.catplot(data=iris, orient="h", kind="box")
结果如下图所示:

axes-level函数更适合pandas或者numpy格式的数据,而不是DataFrame:
sns.violinplot(x=iris.species, y=iris.sepal_length)
结果如下图所示:

控制上述函数绘制图形的大小和形状需要通过matplotlib命令自行设置:
f, ax = plt.subplots(figsize=(7, 3))
sns.countplot(y="deck", data=titanic, color="g")
结果如下图所示:

Showing multiple relationships with facets
与replot()一样,catplot()是在facetgrid上构建的,因此很容易添加faceting变量来绘制更高维度的关系:
sns.catplot(x="day", y="total_bill", hue="smoker",
col="time", aspect=.6,
kind="swarm", data=tips)
结果如下图所示:

g = sns.catplot(x="fare", y="survived", row="class",
kind="box", orient="h", height=1.5, aspect=4,
data=titanic.query("fare > 0"))
g.set(xscale="log")
结果如下图所示:

参考文献:
http://seaborn.pydata.org/tutorial/categorical.html