NMT Data Mining & Big Data

Seaborn——Plotting with categorical data

2019-10-21
NMt

有关分类变量的绘制

@@@@

当你想展示的变量中其中有一个分类变量,则可以用本篇里面的函数进行绘制图形。

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

转载请注明:南梦婷的博客 » 点击阅读原文


Similar Posts

Comments