如果您在R 中使用ggplot2,这将不会显示图例:仅当您在geom 的美学中指定color= 时,才会显示颜色图例。对于r,python 或ggplot 中的“修复”是相同的。您需要组织数据,以便遵循tidy data 原则。在这种情况下,df$b 和 df$c 列各包含两条信息:(1) "y" 的 value 和 (2) "y" 的 type .您应该相应地重新组织数据,以便您的列名变为:x、type_of_y 和 value_of_y。
我将通过填写您提供的数据集进行解释,然后说明我们如何将其更改为整洁的格式,然后您如何(正确)应用代码来表示我相信您想要的情节。
基础知识
这是一个数据集和一个像你的情节一样的情节(同样,它在r...所以我希望你能翻译成python):
df <- data.frame(
x=c(1:5), b=c(10, 12, 14, 9, 8), c=c(9, 11, 11, 12, 14))
ggplot(df, aes(x=x)) +
geom_line(aes(y=b), color='red') +
geom_line(aes(y=c), color='blue')
没有传说,但颜色就在那里,我们绘制出您所期望的。这里的问题是ggplot 在aes() 调用中指定颜色时会绘制一个图例。 为了清楚地看到这一点,让我们做同样的图,但将color=... 移动到@987654349 中@:
ggplot(df, aes(x=x)) +
geom_line(aes(y=b, color='red')) +
geom_line(aes(y=c, color='blue'))
好吧……等等。什么?它现在有一个图例(因为我们把 color inside aes()),但是颜色实际上是按顺序颠倒的......你会注意到颜色不是红色和蓝色,而是ggplot2 的默认“红色”和“青色”颜色。实际上,发生的事情是我们只指定在第一个geom_line 调用中,我们绘制了正确的数据集,但我们只是将数据“命名”为“红色”。同样,我们将另一个数据集“命名”为“蓝色”。 ggplot 根据默认调色板决定使用什么颜色。
无需整理数据即可获得传奇
如果您不想弄乱您的数据,实际上有一种方法可以做到这一点,并且可能会获得您可能会满意的输出。我们只需要在color= 中指明您要调用该系列的名称。
ggplot(df, aes(x=x)) +
geom_line(aes(y=b, color='b')) +
geom_line(aes(y=c, color='c'))
添加另一个color='blue' 以在aes()外部以及内部获得“蓝色”颜色怎么样?嗯……这行不通。例如,如果您这样做,结果与显示的原始图相同(没有图例,但颜色值正确),因为 aes() 在每个 geom_line 调用中被有效地覆盖:
# this doesn't work to keep legend and desired color, the second
# color outside aes() overwrites the one inside aes()
ggplot(df, aes(x=x)) +
geom_line(aes(y=b, color='b'), color='red') +
geom_line(aes(y=c, color='c'), color='blue')
整洁的数据方式(“正确”方式)
虽然上述方法有效,但它违反了整理数据的一般原则以及如何组织数据以便易于分析......以任何你想要的方式。相信我:这绝对是使用任何数据集进行多功能分析的最佳实践,并且几乎总是值得付出努力以这种方式组织数据。
ggplot 想要您将aes() 参数指定为数据集中的列。这意味着我们应该让每一列在您的数据集中都有特定的用途:
x: 这与原始数据集中的 x 相同。它只代表x轴值
type_of_y:此列包含值“b”或“c”,指示值应来自哪个数据系列。
value_of_y:此列包含您将在 y 上绘制的值。
使用dplyr,我们可以非常简单地以这种方式重新组织数据:
df <- df %>% gather('type_of_y', 'value_of_y', -x)
给你:
x type_of_y value_of_y
1 1 b 10
2 2 b 12
3 3 b 14
4 4 b 9
5 5 b 8
6 1 c 9
7 2 c 11
8 3 c 11
9 4 c 12
10 5 c 14
然后您相应地绘制,仅使用一个geom_line 调用并将color 美学应用于type_of_y。像这样的:
ggplot(df, aes(x=x, y=value_of_y)) +
geom_line(aes(color=type_of_y))
这样,您只需指定一个geom_line 调用。在这里可能看起来并没有太大的不同,但是如果您的原始数据集中有多个列怎么办?例如,有“x”,然后是“a”、“b”、“c”...“z”的 y 值!您必须在对geom_line 的单独调用中指定所有这些行!在上述情况下,无论您有多少个不同的 y 值列……您只有相同的两行代码,并且只有一次调用 geom_line。有道理?有关更多信息,我会建议上面的链接。另外,this article 是一本不错的读物。
然后,您可以通过添加 scale_color_manual 并以这种方式指定颜色来指定特定的颜色(还有其他一些方法) - 但如果您需要帮助,我会在单独的问题中提问。另外...不确定python 的代码有何不同。同样,您可以通过labs(color="your new legend title")... 更改图例标题以及其他主题更改。
我知道它与 python 中的代码不太一样,但这应该足以让您了解我们如何在此处进行类似操作。