Matplotlib和Seaborn之多变量可视化

使用颜色表示第三个变量

在 matplotlib 和 seaborn 中,向图形中添加第三个变量的最常见方式是使用颜色。你已经在这节课的集群条形图和热图中见过这种方式。violinplotboxplotbarplot 函数都可以通过添加“hue”参数显示第三个变量集群。可以调整热图的代码,以便描绘第三个变量(而不是计数),只需更改 hist2d 的“weights”参数,或者要馈送给 heatmap 的数据整合函数。

对于散点图来说,可以通过两种不同的方式设置颜色,取决于变量类型。对于数字变量来说,你可以直接在 scatter 函数调用中设置“color”或“c”参数。

plt.scatter(data = df, x = 'num_var1', y = 'num_var2', c = 'num_var3')
plt.colorbar()

image.png

如果你有一个定性变量,可以通过 seaborn 的 FacetGrid 类上的“hue”参数为分类变量的不同级别设置不同的颜色。

g = sb.FacetGrid(data = df, hue = 'cat_var1', size = 5)
g.map(plt.scatter, 'num_var1', 'num_var2')
g.add_legend()

image.png

调色板类型

根据你的变量类型,你可能需要选择默认调色板之外的其他调色板。有三种主要调色板类型:定性、连续和发散调色板。

定性调色板面向的是名目型数据。这是默认调色板采用的调色板类。在定性调色板中,连续性颜色值是有区别的,因此并没暗含任何固有的顺序。好的定性调色板的颜色应该尝试避免在亮度和饱和度方面出现剧烈变化,导致读者认为某个类别比其他类别更重要,除非要故意这么强调。

sb.palplot(sb.color_palette(n_colors=9))

(文档:seaborn palplot, color_palette

image.png

对于其他类型的数据(名目和数字),可能需要在连续尺度和发散尺度之间做出选择。在连续调色板中,连续的颜色值应该相互之间保持系统性。通常,在单个或小范围的色调之间保持从浅到深的顺序,其中浅色表示值较低,深色表示值很高。默认的连续色图“viridis”采用的是相反的表示法,深色表示较低的值,浅色表示很高的值。

sb.palplot(sb.color_palette('viridis', 9))

image.png

大多数情况下,连续调色板可以很好地描绘有序或数字数据。但是,如果变量有一个有意义的零或中心值,你可能需要考虑使用发散调色板。在发散调色板中,将两个具有不同色调的连续调色板放在一起,并用一个共同的颜色(通常是白色或灰色)连接它们。一个色调表示大于中心点的值,另一个色调表示小于中心点的值。

sb.palplot(sb.color_palette('vlag', 9))

image.png

设置调色板

如果你想要(或需要)更改图形的色图,最简单的方式是使用 matplotlib 或 seaborn 中的某个内置函数。matplotlib 文档的此部分具有一个可以当做颜色映射的字符串列表。对于大部分情况,请使用 matplotlib 的内置调色板(’viridis' 等)或来自 ColorBrewer 的调色板;剩余的调色板看起来可能不够一致。Seaborn 还增加了以下多个调色板:

  • 定性(全部多达 6 种颜色):'deep’、’pastel’、’dark’、’muted’、’bright’、’colorblind'
  • 有序:’rocket' (white-orange-red-purple-black)、’mako' (mint-green-blue-purple-black)
  • 发散:’vlag' (blue-white-red)、’icefire' (blue-black-orange)

对于所有这些字符串,在后面附加 '_r' 会颠倒调色板,如果序列或发散调色板的呈现方式与你预期的相反,这么设置很有用。

设置调色板的方式取决于所使用的绘图函数。请参阅相关文档,了解具体详情。例如,在 FacetGrid 中可以通过“palette”参数设置调色板,在 scatter 中可以通过“cmap”参数设置。在使用发散调色板时,你可能需要指定“vmin”和“vmax”参数,以便调色板中的中性点与刻度的中心点为同一个点。此外,创建其他标准化函数的解决方案(例如在此 Stack Overflow 会话中发布的解决方案)可以用于精细地控制色图。发散颜色刻度对热图来说很常见,专门有一个“center”参数用于设置中心值。

最后,请注意透明度和重叠对图形可解释性的影响。如果定性刻度上具有不同颜色的点重叠了,可能会形成无法与调色板中的颜色匹配的第三种颜色。如果定性刻度上有多个点重叠了,那么可能会形成一个实际上不存在于数据中的值。为了保险起见,避免或尽量不使用透明度。你可能需要仅绘制示例数据点,确保第三个变量的效果很明显。

plt.figure(figsize = [5,5])

# left: qualitative points
plt.scatter(0,0.5,s = 1e4, c = sb.color_palette()[0], alpha = 0.5)
plt.scatter(0,-0.5,s = 1e4, c = sb.color_palette()[1], alpha = 0.5)

# right: quantitative points
plt.scatter(1,0.5,s = 1e4, c = sb.color_palette('Blues')[2], alpha = 0.5)
plt.scatter(1,-0.5,s = 1e4, c = sb.color_palette('Blues')[4], alpha = 0.5)

# set axes for point overlap
plt.xlim(-0.5,1.5)
plt.ylim(-3.5,3.5)
plt.xticks([])
plt.yticks([])

image.png

在两个变量之间进行分面

之前在这节课,你了解了可以如何使用 FacetGrid 根据分类变量的不同级别对数据集分组,然后为每个子集创建一个图形。之前演示的分面图形是单变量图形,实际上你可以使用任何图形类型,并使用分面双变量图形创建多变量图形。

借助 FacetGrid,不仅可以根据列对变量进行分面,还可以根据行分面。我们可以在两个分面坐标轴的每个轴上设置分类变量,这是描绘多变量趋势的另外一种方法。

g = sb.FacetGrid(data = df, col = 'cat_var2', row = 'cat_var1', size = 2.5,
                margin_titles = True)
g.map(plt.scatter, 'num_var1', 'num_var2')

设置 margin_titles = True 表示不再将每个分面标记为行和列变量的组合,而是将标签单独放在分面网格的顶部和右侧边缘。这种方式效果很棒,因为默认的图形标题通常很长。

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

推荐阅读更多精彩内容