如何使用 Seaborn 在每个刻度标签上设置不同的颜色

如何使用 Seaborn 在每个刻度标签上设置不同的颜色

在此示例中,我将演示如何显式设置 x 轴刻度线标签的颜色。在刻度线标签上使用颜色是吸引观众注意图表特定部分的好方法。

main_image-2.png

一点背景

在 Seaborn 中有两种访问方式 x_ticklabels 取决于你是否使用 轴级 功能或 人物级 功能。您可以直接从 Seaborn 的网站 ,但在高层次上,您可以将其视为:

  1. 轴级——您直接与 matplotlib 函数交互。高度的灵活性,但需要更多的工作。
  2. 图级——您正在通过 Seaborn 对象与 matplotlib 进行交互。灵活性较低,但对产品现成图表的描述较少。

幸运的是,只有 3 个图形级函数,所以如果您不使用其中之一,那么您正在使用轴级函数。下图取自 Seaborn 的网站,大框中的三种绘图类型为图形级别,其余为轴级别。

seaborn_axes_v_figure.png

在本例中,我将介绍两个图形级函数, 条形图() & 线图() , 和两个轴级, 猫图() & 关系图() .但是您很快就会发现每种类型的代码几乎相同,您可以将相同的技术应用于任何绘图。

导入库和数据

为了给我们一些数据,我下载了 冠军数据.csv 小鸡 .您可以使用这个确切的数据集按照教程进行操作,您只需将 excel 转换为 csv(或尝试直接导入)并进行一些小调整。
该数据集包含 1980 年至 2018 年(39 年)的 NBA 冠军得主。该数据集包含获胜球队参加的每场比赛的一行以及球队统计数据。

 df.sample(5)

png

我将创建一个快速汇总表,列出每支球队在 39 年期间赢得的总冠军头衔。我还将添加比例和累积比例。如果您想获得有关创建比例和嵌套比例的更多信息,我已经单独制作了一个 教程 关于这个话题。

png

既然我们有这张小桌子,我们不妨快速分析一下我们所看到的。
这里有一些有趣的见解。 (如果你愿意,可以跳过这部分)

  1. NBA目前有30支球队,在39年的时间里,只有10支球队赢得了NBA总冠军。即使我们考虑到 80 年代有 22 到 25 支球队这一事实,我们仍然可以体会到一支球队在任何一年一路走来是多么罕见。
  2. 即使你不太了解篮球或 NBA 的运作方式,我们也可以从这些数据中推断出一支出色的球队可以统治联盟多年。如果你是一支低于标准的NBA球队,几乎不可能赢得总冠军。一支平庸的球队有可能进入季后赛,但考虑到一支球队每轮需要赢得的比赛数量,一支糟糕的球队不太可能赢得冠军。同样,一旦你是最好的团队,其他人需要一段时间才能赶上。一支优秀的团队可以保持胜利和/或保持多年的竞争力。
  3. 拥有最多总冠军的球队是拥有 10 座总冠军的洛杉矶湖人队。这 10 支球队分为两个不同的十年,由两组不同的核心球员(魔术师约翰逊/卡里姆·阿卜杜勒-贾巴尔和科比·布莱恩特/沙奎尔·奥尼尔)推动。第二支球队是芝加哥公牛队,有 6 人。这六人是在一个十年(超过 7 年)内仅由一组核心球员(迈克尔乔丹/斯科蒂皮蓬)赢得的。我希望这能说明这一成就是多么令人印象深刻。

现在我们有了数据集,让我们开始绘图。

轴水平功能

条形图

我们将从一个简单的条形图开始。对于这个例子,我们假设我们知道 70% 的冠军是由 5 支球队赢得的,所以我们将数字 4 (0–4) 硬编码到我们的脚本中。
前七行代码只是设置图表。 For 循环是所有动作发生的地方。如上所述,当我们使用轴级函数时,我们直接与 matplotlib 交互。因此,当我们创建 pyplot.Axes 对象时 G ,我们可以使用它来访问 get_xticklabels() 列表。
一旦有了列表,我们就可以遍历它,列表中的每个元素都是一个标签对象。一旦我们可以访问标签对象,我们就可以对它做任何我们想做的事情。在这种情况下,我做的第一件事就是 设置颜色() 第二件事是 设置字体大小() .我从配对调色板中选择的颜色。
第五个之后的任何团队都将获得褪色的蓝色阴影和更小的(默认)字体大小。
使用此图表,我们可以绘制整个数据集,并且仍然可以将观众的注意力吸引到前六支球队。

png

线图

在第二个示例中,我们仍然使用轴级函数 lineplot。这张图表的不同之处在于,我想让哪些团队获得不同颜色的选择更加动态,因为最好将硬编码保持在最低限度。在此示例中,我将演示如何在没有硬编码值的情况下将自定义颜色应用于前 N% 的团队。
这种效果可以通过两步过程来实现。在第一步中,我们为所有剩余的团队设置颜色,换句话说,那些不属于前 70% 的团队。这实际上会为所有标签设置颜色,但这是必要的。
在第二步中,我们仅更改前 70% 的颜色。这是通过访问 get_yticks() 来自 matplotlib.Axes 对象。
我们需要分两步反向执行的原因之一是因为对象 G 不再有权访问数据,我们只有 x 轴标签和 y 轴标签,它们的大小不同(见下面的打印输出)。它们大小不同的原因应该很明显,单个 y 轴值可以有多个 x 轴值。原因 g.get_yticks() 在步骤 2 中使用,而不是 g.get_yticklabels() 是因为前者将返回一个可以与另一个数字进行比较的浮点数,而后者返回一个 matplotlib.text.Text 对象。

 x-ticks 数量:11  
 y 刻度数:6

png

使用轴级函数的示例到此结束。要将上述方法应用于任何其他轴级图表,只需更改函数的名称(并相应地调整 x/y 值)。

图级函数

现在我们将继续讨论图形级别的图。
我们仍然需要访问 get_yticklabels() matplotlib 中的函数,但现在我们需要通过 Seaborn 对象来执行此操作。轴级和图形级方法的唯一区别在于,在图形级方法中,我们首先需要在运行循环之前访问 maplotlib.Axes 对象,如下所示。

总图

png

重新绘图

现在我将使用 关系图() 图形级函数来演示如何使字体颜色更动态地变化。由于 关系图() 使用两个数值变量效果更好,我使用了原始数据框中的点和辅助 (PTS/AST) 列 ( df )。我随意选择突出显示助攻数少于 35 的总分。
两步过程是相同的 线图() 上面,唯一的区别是我们首先需要从 Seaborn 对象中提取 matplotlib.Axes 对象。

png

我希望上面的示例展示了在轴级和图形级 seaborn 图表上自定义 x/y 刻度线标签是多么容易。使用不同的颜色和阴影通常是将观众的注意力吸引到图表上特定部分的好方法,同时仍然显示所有数据。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明

本文链接:https://www.qanswer.top/40268/51230117

posted @ 2022-10-01 17:51  哈哈哈来了啊啊啊  阅读(524)  评论(0编辑  收藏  举报