Python 数据可视化:分类特征统计图

上一课已经体验到了 Seaborn 相对 Matplotlib 的优势,本课将要介绍的是 Seaborn 对分类数据的统计,也是它的长项。

针对分类数据的统计图,可以使用 sns.catplot 绘制,其完整参数如下:

seaborn.catplot(x=None, y=None, hue=None, data=None, row=None, col=None, col_wrap=None, estimator=<function mean>, ci=95, n_boot=1000, units=None, order=None, hue_order=None, row_order=None, col_order=None, kind='strip', height=5, aspect=1, orient=None, color=None, palette=None, legend=True, legend_out=True, sharex=True, sharey=True, margin_titles=False, facet_kws=None, **kwargs)

本课使用演绎的方式来学习,首先理解这个函数的基本使用方法,重点是常用参数的含义。

  • x,y,hue:参数 data 所设置的数据集中的特征,其中 hue 是嵌入到坐标系中的分类特征,x, y 分别是数据集中作为横纵轴的特征。
  • data:一个 DataFrame 对象,即数据集。
  • row,col:如果要绘制分区坐标系,用这两个参数分别设置了“坐标矩阵”的行列。例如,指定 col 的值为某一个分类特征,就会按照该分类特征数据属性,划分不同坐标系分区。
  • order,hue_order:字符串组成的列表,指定分类特征显示的顺序。
  • kind:这个参数很重要,默认值是 'strip',其他取值还可以是:“point”、“bar”、“swarm”、“box”、“violin”or“boxen”,每个值都对应着一种专门的分类统计图,并且也对应着专有的函数,这是本课要重点阐述的。
  • palette:设置色彩方案。

其他的参数,根据名称也能基本理解。

下面就依据 kind 参数的不同取值,分门别类地介绍各种不同类型的分类统计图。

2.2.1 分类特征的散点图

  • kind = 'strip',默认值,等同函数 sns.stripplot。
  • kind = 'swarm',等同函数 sns.swarmplot。

读入数据集:

import seaborn as sns
sns.set(style="whitegrid")

exercise = sns.load_dataset("exercise")
exercise.sample(5)

avatar

然后用这个数据集制图,看看效果:

%matplotlib inline
sns.catplot(x="time", y="pulse", hue="kind", data=exercise)    #①

输出结果:

enter image description here

毫无疑问,这里绘制的是散点图。但是,该散点图的横坐标是分类特征 time 中的三个值,并且用 hue='kind' 又将分类特征插入到图像中,即用不同颜色的的点代表又一个分类特征 kind 的值,最终得到这些类别组合下每个记录中的 pulse 特征值,并以上述图示表示出来。也可以理解为,x='time', hue='kind' 引入了图中的两个特征维度。

语句 ① 中,就没有特别声明参数 kind 的值,此时是使用默认值 'strip'。

与 ① 等效的还有另外一个对应函数 sns.stripplot。

sns.stripplot(x="time", y="pulse", hue="kind", data=exercise)    #②

输出结果:

enter image description here

② 与 ① 的效果一样。

不过,在 sns.catplot 中的两个参数 row、col,在类似 sns.stripplot 这样的专有函数中是没有的。因此,下面的图,只有用 sns.catplot 才能简洁直观。

sns.catplot(x='time', y='pulse', hue='kind', col='diet', data=exercise, kind='strip')    #③

输出结果:

enter image description here

不过,如果换一个叫角度来说,类似 sns.stripplot 这样的专有函数,表达简单,参数与 sns.catplot 相比,有所精简,使用起来更方便。

seaborn.stripplot(x=None, y=None, hue=None, data=None, order=None, hue_order=None, jitter=True, dodge=False, orient=None, color=None, palette=None, size=5, edgecolor='gray', linewidth=0, ax=None, **kwargs)

仔细比较,sns.catplot 和 sns.stripplot 两者还是稍有区别的,虽然在一般情况下两者是通用的。

因此,不要追求某一个是万能的,各有各的用途,存在即合理。

不过,下面的声明请注意:如果没有非常的必要,比如绘制分区图,在本课中后续都演示如何使用专有名称的函数。

sns.stripplot

前面已经初步解释了这个函数,为了格式完整,这里再重复一下,即 sns.catplot 中参数 kind='strip'。

如果非要将此函数翻译为汉语,可以称之为“条状散点图”。以分类特征为一坐标轴,在另外一个坐标轴上,根据分类特征,将该分类特征数据所在记录中的连续值沿坐标轴描点。

从语句 ② 的结果图中可以看到,这些点虽然纵轴的数值有相同的,但是没有将它们重叠。因此,我们看到的好像是“一束”散点,实际上,所有点的横坐标都应该是相应特征分类数据,也不要把分类特征的值理解为一个范围,分散开仅仅是为了图示的视觉需要。

ax = sns.stripplot(x="time", y="pulse", data=exercise, jitter=0)     #④

输出结果:

enter image description here

④ 相对 ② 的图示,在于此时同一纵轴值的都重合了——本来它们的横轴值都是一样的。实现此效果的参数是 jitter=0,它可以表示点的“振动”,如果默认或者 jitter=True,意味着允许描点在某个范围振动——语句 ② 的效果;还可设置为某个 0 到 1 的浮点,表示许可振动的幅度。请对比下面的操作。

ax = sns.stripplot(x="time", y="pulse", data=exercise, jitter=0.05)

输出结果:

enter image description here

语句 ② 中使用 hue='kind' 参数向图中提供了另外一个分类特征,但是,如果感觉图有点乱,还可以这样做:

ax = sns.stripplot(x="time", y="pulse", data=exercise, hue='kind', 
                   dodge=True, palette='Set2')    #⑤

输出结果:

enter image description here

dodge=True 的作用就在于将 hue='kind' 所引入的特征数据分开,相对 ② 的效果有很大差异。

并且,在 ⑤ 中还使用了 paletter='Set2' 设置了色彩方案。

sns.stripplot 函数中的其他有关参数,请读者使用帮助文档了解。

sns.swarmplot

此函数即 sns.catplot 的参数 kind='swarm'。

tips = sns.load_dataset("tips")
sns.swarmplot(x="day", y="total_bill", data=tips)
# 下面的语句,与之等效
# sns.catplot(x="day", y="total_bill", kind='swarm', data=tips)

输出结果:

enter image description here

再绘制一张简单的图,一遍研究这种图示的本质。

sns.swarmplot(x=tips["total_bill"])

输出结果:

enter image description here

此图只使用了一个特征的数据,简化表象,才能探究 sns.swarmplot 的本质。它同样是将该特征中的数据,依据其他特征的连续值在图中描点,并且所有点在默认情况下不彼此重叠——这方面与 sns.stripplot 一样。但是,与之不同的是,这些点不是随机分布的,它们经过调整之后,均匀对称分布在分类特征数值所在直线的两侧,这样能很好地表示数据的分布特点。但是,这种方式不适合“大数据”。

seaborn.swarmplot(x=None, y=None, hue=None, data=None, order=None, hue_order=None, dodge=False, orient=None, color=None, palette=None, size=5, edgecolor='gray', linewidth=0, ax=None, **kwargs)

sns.swarmplot 的参数似乎也没有什么太特殊的。下面使用几个,熟悉一番基本操作。

在分类维度上还可以再引入一个维度,用不同颜色的点表示另外一种类别,即使用 hue 参数来实现。

sns.swarmplot(x="day", y="total_bill", hue="smoker", data=tips, palette="Set2")

输出结果:

enter image description here

这里用 hue = 'smoker' 参数又引入了一个分类特征,在图中用不同颜色来区分。

如果觉得会 smoker 特征的值都混在一起有点乱,还可以使用下面方式把他们分开——老调重弹。

sns.swarmplot(x="day", y="total_bill", hue="smoker", data=tips, palette="Set2", dodge=True)

输出结果:

enter image description here

生成此效果的参数就是 dodge=True,它的作用就是当 hue 参数设置了特征之后,将 hue 的特征数据进行分类。

2.2.2 分类特征的分布图

sns.catplot 函数的参数 kind 可以有三个值,都是用于绘制分类的分布图:

  • kind = 'box',等同函数 sns.boxplot
  • kind = 'violin',等同函数 sns.violinplot
  • kind = 'boxen',等同函数 sns.boxenplot

下面依次对这三个专有函数进行阐述。

sns.boxplot

还有 54% 的精彩内容
©著作权归作者所有,转载或内容合作请联系作者
支付 ¥3.99 继续阅读
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,128评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,316评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,737评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,283评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,384评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,458评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,467评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,251评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,688评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,980评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,155评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,818评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,492评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,142评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,382评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,020评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,044评论 2 352

推荐阅读更多精彩内容