社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

Python Seaborn (5) 分类数据的绘制

EasyCharts • 5 年前 • 1040 次点击  
声明
本文作者 未禾,首发于作者知乎,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 在数据挖掘中已经可以覆盖到大部分数据格式,其快速做图能力已经可以得到足量的发挥。最近工作压力日趋增大,全文还有最难翻译的一章,会坚持在最近放出。

如果文章对你有帮助,请不吝点个赞,方便更多的小伙伴能看到,快快点击 阅读原文吧。

如果文章有理解、翻译谬误请留言,十分感谢!

大家都在看

plotnine:python数据可视化版ggplot2

Python科研统计作图Plotnine+Seaborn+matplotlib替代R ggplot2系列(1)

Python科研统计作图Plotnine+Seaborn+matplotlib替代R ggplot2系列(2)

Python Seaborn (1) 艺术化的图表控制

Python Seaborn (2) 斑驳陆离的调色板

Python Seaborn (3) 分布数据集的可视化

Python Seaborn (4) 线性关系的可视化



加入QQ群可领取: plotnine的数据可视化学习手册


如需联系EasyCharts团队

请加微信:EasyCharts


【书籍推荐】 《Excel 数据之美--科学图表与商业图表的绘制》

【手册获取】国内首款-数据可视化参考手册:专业绘图必备

【必备插件】  EasyCharts -- Excel图表插件

【网易云课堂】  Excel 商业图表修炼秘笈之基础篇





今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/v9QxJdB33y
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/28511
 
1040 次点击