本文作者 未禾,首发于作者知乎,https://zhuanlan.zhihu.com/p/27683042,已获作者授权原创形式发布,欢迎点击【阅读原文】关注支持!我们之前探讨了如何使用散点图和回归模型拟合来可视化两个变量之间的关系,以及如何在其他分类变量的层次之间进行展示。 当然,还有一大类问题就是分类数据的问题了? 在这种情况下,散点图和回归模型方法将不起作用。当然,有几个观察可视化这种关系的选择,我们将在本章中讨论。
非常实用的方法是将 Seaborn 的分类图分为三类,将分类变量每个级别的每个观察结果显示出来,显示每个观察分布的抽象表示,以及应用统计估计显示的权重趋势和置信区间:
· 第一个包括函数 swarmplot() 和 stripplot()
· 第二个包括函数 boxplot() 和 violinplot()
· 第三个包括函数 barplot() 和 pointplt()
在了解他们如何接受数据传入方面,尽管每个参数都聚有控制应用于该数据可视化细节的特定参数,但这些功能都共享一个基本的 API。
这与之前的 regplot() 和 lmplot() 的关系非常相似(未禾备注:在 seaborn 的构架中很容易分成这样两类用途相似,使用有所差异的替代方案函数)。在 Seaborn 中,相对低级别和相对高级别的方法用于定制分类数据的绘制图,上面列出的函数都是低级别的,他们绘制在特定的 matplotlib 轴上。还有更高级别的 factorplot()(未禾备注:这是一个非常简明的快速绘制函数,具体用法会在最后有详细介绍),它将这些功能与 FacetGrid 结合,以便在面板的网格中应用分类图像。
使用 “整洁” 格式的 DataFrame 调用这些函数是最简单和最好的,尽管较低级别的函数也接受宽形式的 DataFrames 或简单的观察向量。见下面的例子。
未禾备注:你甚至可以理解为这一章都是在具体学习 factorplot() 函数,快速、直接、功能强大的绘图函数谁不爱?
%matplotlib inline
import numpy as np
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt
import seaborn as sns
sns.set(style="whitegrid", color_codes=True)
np.random.seed(sum(map(ord, "categorical")))
titanic = sns.load_dataset("titanic")
tips = sns.load_dataset("tips")
iris = sns.load_dataset("iris")
显示分类变量级别中某些定量变量的值的一种简单方法使用 stripplot(),它会将分散图概括为其中一个变量是分类的:
sns.stripplot(x="day", y="total_bill", data=tips);在条纹图中,散点图通常将重叠。这使得很难看到数据的完整分布。一个简单的解决方案是使用一些随机的 “抖动” 调整位置(仅沿着分类轴)
未禾备注:抖动是平时可视化中的常用的观察 “密度” 的方法,除了使用参数抖动,特定的抖动需求也可以用 numpy 在数据上处理实现
sns.stripplot(x="day", y="total_bill", data=tips, jitter=True);
不同的方法是使用函数 swarmplot(),它使用避免重叠点的算法将分类轴上的每个散点图点定位:
未禾备注:道理上,即使抖动还是会有重叠的可能,所以这种方法可能更好
sns.swarmplot(x="day", y="total_bill", data=tips);当然也可以传入 hue 参数添加多个嵌套的分类变量。高于分类轴上的颜色和位置时冗余的,现在每个都提供有两个变量之一的信息:
sns.swarmplot(x="day", y="total_bill", hue="sex",data=tips);一般来说,Seaborn 分类绘图功能试图从数据中推断类别的顺序。 如果您的数据有一个 pandas 分类数据类型,那么类别的默认顺序可以在那里设置。 对于其他数据类型,字符串类型的类别将按照它们在 DataFrame 中显示的顺序进行绘制,但是数组类别将被排序:
sns.swarmplot(x="size", y="total_bill", data=tips);使用这些图,将分类变量放在垂直轴上是非常有用的(当类别名称相对较长或有很多类别时,这一点特别有用)。 您可以使用 orient 关键字强制定向,但通常可以从传递给 x 和 / 或 y 的变量的数据类型推断绘图方向:
sns.swarmplot(x="total_bill", y="day", hue="time", data=tips);分类散点图固然简单实用,但在某些特定的的情况下,他们可以提供的值的分布信息会变得及其有限(并不明晰)。 有几种方式可以方便的解决这个问题,在类别之间进行简单比较并汇总信息,我们快速讨论并比较一些适合这类数据观测的函数。
第一个是熟悉的 boxplot()。这种图形显示了分布的三个四分位值与极值。“晶须” 延伸到低于和低四分位数的 1.5 IQR 内的点,然后独立显示落在该范围之外的观测值。 重要的是,这意味着 boxplot 中的每个值的显示都对应于数据中的实际观察值:
未禾备注:IQR 即统计学概念四分位距,第一四分位与第三四分位之间的距离,具体内容请参考更深入的相关资料
sns.boxplot(x="day", y="total_bill", hue="time", data=tips);不同的方法是一个 violinplot(),它结合了箱体图和分布教程中描述的核心密度估计过程:
未禾备注:核密度估计,即全文中提到的,或参数内传入的 kde,具体概念内容请参考相关文档
sns.violinplot(x="total_bill", y="day", hue="time", data=tips);这种方法使用核密度估计来更好地描述值的分布。此外,小提琴内还显示了箱体四分位数和晶须值。由于小提琴使用 KDE,还有一些其他可以调整的参数,相对于简单的 boxplot 增加了一些复杂性:
sns.violinplot(x="total_bill", y="day", hue="time", data=tips,
bw=.1, scale="count", scale_hue=False);
当色调参数只有两个级别时,也可以传入参数 split 至 violinplot(),这样可以更有效地利用空间:
sns.violinplot(x="day", y="total_bill", hue="sex", data=tips, split=True);最后,在绘制提琴图的时候有几个选项,包括显示每个人的观察结果而不是总结框图值的方法:
sns.violinplot(x="day", y="total_bill", hue="sex", data=tips,
split=True, inner="stick", palette="Set3");
将 swarmplot() 或者 swarmplot() 与 violinplot() 或 boxplot() 结合使用可以显示每个观察结果以及分布的摘要:
未禾备注:说实话,并不推荐这么做,过多的信息除了炫技没有什么实际用处。
sns.violinplot(x="day", y="total_bill", data=tips, inner=None) sns.swarmplot(x="day", y="total_bill", data=tips, color="w", alpha=.5);通常,不是显示每个类别中的分布,你可能希望显示值的集中趋势。 Seaborn 有两种显示此信息的主要方法,但重要的是,这些功能的基本 API 与上述相同。(未禾:这是多么令人愉悦的事情)
最熟悉的方式完成这个目标是一个条形图。 在 Seaborn 中 barplot() 函数在完整数据集上运行,并显示任意估计,默认情况下使用均值。 当在每个类别中有多个观察值时,它还使用引导来计算估计周围的置信区间,并绘制使用误差条:
sns.barplot(x="sex", y="survived", hue="class", data=titanic);条形图的特殊情况是当您想要显示每个类别中的观察次数,而不是计算第二个变量的统计量。这类似于分类而不是定量变量的直方图。在 Seaborn 中,使用 countplot() 函数很容易绘制:
未禾备注:函数将默认使用 count 参数作为 x/y 中未传的一组维度
sns.countplot(x="deck", data=titanic, palette="Greens_d");可以使用上面讨论的所有选项来调用 barplot() 和 countplot(),以及在每个函数的详细文档中的其他选项:
sns.countplot(y="deck", hue="class", data=titanic, palette="Greens_d");pointplot() 函数提供了可视化相同信息的另一种风格。该函数还对另一轴的高度估计值进行编码,而不是显示一个完整的柱型,它只绘制点估计和置信区间。另外,点图连接相同 hue 类别的点。这使得很容易看出主要关系如何随着第二个变量的变化而变化,因为你的眼睛很好地收集斜率的差异:
sns.pointplot(x="sex", y="survived", hue="class", data=titanic);为了使能够在黑白中重现的图形,可以使用不同的标记和线条样式来展示不同 hue 类别的层次:
sns.pointplot(x="class", y="survived", hue="sex", data=titanic,
palette={"male": "g", "female": "m"},
markers=["^", "o"], linestyles=["-", "--"]);
虽然使用 “长格式” 或“整洁”数据是优选的,但是这些功能也可以应用于各种格式的 “宽格式” 数据,包括 pandas DataFrame 或二维 numpy 数组阵列。这些对象应该直接传递给数据参数:
sns.boxplot(data=iris,orient="h");此外,这些函数接受 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="c");
正如我们上面提到的,有两种方法可以在 Seaborn 中绘制分类图。与回归图中的二元性相似,您可以使用上面介绍的函数,也可以使用更高级别的函数 factorplot(),将这些函数与 FacetGrid() 相结合,通过这个图形的更大的结构来增加展示其他类别的能力。 默认情况下,factorplot() 产生一个 pairplot():
sns.factorplot(x="day", y="total_bill", hue="smoker", data=tips);然而,kind 参数可以让您选择以上讨论的任何种类的图:
sns.factorplot(x="day", y="total_bill", hue="smoker", data=tips, kind="bar");使用 factorplot() 的主要优点是很容易调用"facet" 展开更多其他分类变量:
sns.factorplot(x="day", y="total_bill", hue="smoker",
col="time", data=tips, kind="swarm");
任何一种图形都可以画出来。基于 FacetGrid 的工作原理,要更改图形的大小和形状,需要指定适用于每个方面的 size 和 aspect 参数:
sns.factorplot(x="time", y="total_bill", hue="smoker",
col="day", data=tips, kind="box", size=4, aspect=.5);
重要的是要注意,你也可以直接使用 boxplot() 和 FacetGrid 来制作这个图。但是,必须特别注意确保分类变量的顺序在每个方面实施,方法是使用具有 Categorical 数据类型的数据或通过命令和 hue_order。
sns.factorplot(x="time", y="total_bill", hue="smoker",hue_order=["No","Yes"]
,col="day", data=tips, kind="box", size=4, aspect=.5,
palette="Set3");
由于分类图的广义 API,它们应该很容易应用于其他更复杂的上下文。 例如,它们可以轻松地与 PairGrid 结合,以显示多个不同变量之间的分类关系:
g = sns.PairGrid(tips,
x_vars=["smoker", "time", "sex"],
y_vars=["total_bill", "tip"],
aspect=.75, size=3.5)
g.map(sns.violinplot, palette="pastel");
最后在这章翻译结束后,未禾专门收集了这个重要函数的所有参数说明,方便参考:
seaborn.factorplot(x=None, y=None, hue=None, data=None, row=None, col=None, col_wrap=None, estimator=, ci=95, n_boot=1000, units=None, order=None, hue_order=None, row_order=None, col_order=None, kind='point', size=4, aspect=1, orient=None, color=None, palette=None, legend=True, legend_out=True, sharex=True, sharey=True, margin_titles=False, facet_kws=None, **kwargs)
Parameters:
x,y,hue 数据集变量 变量名
date 数据集 数据集名
row,col 更多分类变量进行平铺显示 变量名
col_wrap 每行的最高平铺数 整数
estimator 在每个分类中进行矢量到标量的映射 矢量
ci 置信区间 浮点数或 None
n_boot 计算置信区间时使用的引导迭代次数 整数
units 采样单元的标识符,用于执行多级引导和重复测量设计 数据变量或向量数据
order, hue_order 对应排序列表 字符串列表
row_order, col_order 对应排序列表 字符串列表
kind : 可选:point 默认, bar 柱形图, count 频次, box 箱体, violin 提琴, strip 散点,swarm 分散点(具体图形参考文章前部的分类介绍)
size 每个面的高度(英寸) 标量
aspect 纵横比 标量
orient 方向 "v"/"h"
color 颜色 matplotlib 颜色
palette 调色板 seaborn 颜色色板或字典
legend hue 的信息面板 True/False
legend_out 是否扩展图形,并将信息框绘制在中心右边 True/False
share{x,y} 共享轴线 True/False
facet_kws FacetGrid的其他参数 字典
终于抽时间把最重要的三章翻译完了,有了这三章 seaborn 在数据挖掘中已经可以覆盖到大部分数据格式,其快速做图能力已经可以得到足量的发挥。最近工作压力日趋增大,全文还有最难翻译的一章,会坚持在最近放出。
如果文章对你有帮助,请不吝点个赞,方便更多的小伙伴能看到,快快点击 阅读原文吧。
如果文章有理解、翻译谬误请留言,十分感谢!
加入QQ群可领取: plotnine的数据可视化学习手册
如需联系EasyCharts团队
请加微信:EasyCharts
【书籍推荐】
《Excel 数据之美--科学图表与商业图表的绘制》
【手册获取】国内首款-数据可视化参考手册:专业绘图必备
【必备插件】 EasyCharts -- Excel图表插件
【网易云课堂】 Excel 商业图表修炼秘笈之基础篇