plotnine 不添加图例

我正在使用 plotnine 在同一个图中绘制两个图表。一张图表使用您将在下面看到的数据框中的“b”值,另一张使用“c”中的值。


我所需要的只是显示一个简单的图例图例,在其中我看到带有相应颜色的“c”和“b”。


def plot_log_detected():

    df = DataFrame({'x': [1, 2, 3, 4, 5],

                    'b': >>>SOME VALUES DOESNT MATTER<<<,

                    'c': >>>SOME VALUES DOESNT MATTER<<<

                   })

    return ggplot(aes(x='x', y='b'), data=df) + geom_point(size=1) +\

           geom_line(aes(y='b'), color='black') + \

           geom_line(aes(y='c'), color='blue') +  \

           ggtitle("TITLE") + \

           labs(y="Y AXIS", x="X AXIS")


猛跑小猪
浏览 284回答 4
4回答

一只名叫tom的猫

ggplot2如果您在其中任何一个中使用,这将不会显示图例R:颜色的图例将仅在您color=在美学中指定时表示 a&nbsp;geom。两者python或ggplotfor中的“修复”是相同的r。您需要组织数据,以便遵循整洁的数据原则。在这种情况下,df$b每个df$c列都包含两条信息:(1) “y”的值和(2) “y”的类型。您应该相应地重新组织数据,以便您的列名变为:x、type_of_y和value_of_y。我将通过填写您提供的数据集进行解释,然后说明我们如何将其更改为整洁的格式,然后您如何(正确)应用代码来表示我相信您想要的情节。基础知识这是一个数据集和一个像你的情节一样的情节(同样,它在r......所以我希望你能翻译成python):df <- data.frame(&nbsp; &nbsp; x=c(1:5), b=c(10, 12, 14, 9, 8), c=c(9, 11, 11, 12, 14))ggplot(df, aes(x=x)) +&nbsp; &nbsp; geom_line(aes(y=b), color='red') +&nbsp; &nbsp; geom_line(aes(y=c), color='blue')没有传说,但颜色就在那里,我们绘制您所期望的。这里的问题是当您在调用ggplot中指定颜色时会绘制一个图例。 为了清楚地看到这一点,让我们做同样的情节,但移动内部:aes()color=...aes()ggplot(df, aes(x=x)) +&nbsp; &nbsp; geom_line(aes(y=b, color='red')) +&nbsp; &nbsp; geom_line(aes(y=c, color='blue'))好的,那……等等。什么?它现在有一个图例(因为我们把它放在color 里面 aes()),但是颜色实际上是按顺序颠倒的,而且......你会注意到颜色不是红色和蓝色,而是默认的“红色”和“蓝绿色”颜色ggplot2。实际上,发生的事情是我们只指定在第一次geom_line调用中,我们绘制了正确的数据集,但我们只是将数据“命名”为“红色”。同样,我们将另一个数据集“命名”为“蓝色”。 ggplot根据默认调色板决定使用什么颜色。无需整理数据即可获得传奇如果您不想弄乱您的数据,实际上有一种方法可以做到这一点,并且可能会获得您可能会满意的输出。我们只需要在名称中注明color=您要调用该系列即可。ggplot(df, aes(x=x)) +&nbsp; &nbsp; geom_line(aes(y=b, color='b')) +&nbsp; &nbsp; 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)) +&nbsp; &nbsp; geom_line(aes(y=b, color='b'), color='red') +&nbsp; &nbsp; 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&nbsp;<-&nbsp;df&nbsp;%>%&nbsp;gather('type_of_y',&nbsp;'value_of_y',&nbsp;-x)给你:&nbsp; &nbsp;x type_of_y value_of_y1&nbsp; 1&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;b&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;102&nbsp; 2&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;b&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;123&nbsp; 3&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;b&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;144&nbsp; 4&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;b&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 95&nbsp; 5&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;b&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 86&nbsp; 1&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;c&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 97&nbsp; 2&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;c&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;118&nbsp; 3&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;c&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;119&nbsp; 4&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;c&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;1210 5&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;c&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;14然后你相应地绘制,只使用一个geom_line调用并将color美学应用于type_of_y. 像这样的东西:ggplot(df, aes(x=x, y=value_of_y)) +&nbsp; &nbsp; geom_line(aes(color=type_of_y))这样,您只需指定一个geom_line调用。在这里可能看起来并没有太大的不同,但是如果您的原始数据集中有多个列怎么办?例如,有“x”,然后是“a”、“b”、“c”...“z”的 y 值!您必须在单独的调用中指定所有这些行geom_line!在上述情况下,无论您有多少个不同的 y 值列……您只有相同的两行代码,并且只有一次调用geom_line.&nbsp;说得通?有关更多信息,我会建议上面的链接。此外,这篇文章非常适合阅读。然后,您可以通过添加scale_color_manual和指定颜色来指定特定颜色(还有其他一些方法) - 但如果您需要帮助,我会在单独的问题中提问。另外...不确定代码与python.&nbsp;labs(color="your new legend title")同样,您可以通过... 在其他主题更改中更改图例的标题。我知道它与 中的代码并不完全相同python,但这应该足以让您了解我们如何在其中进行类似的操作。

萧十郎

def plot_log_detected():&nbsp; &nbsp; df = DataFrame({'x': [1, 2, 3, 4, 5],&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'b': >>>SOME VALUES DOESNT MATTER<<<,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'c': >>>SOME VALUES DOESNT MATTER<<<&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;})&nbsp; &nbsp; plot = (&nbsp; &nbsp; &nbsp; &nbsp; ggplot(aes(x='x', y='b'), data=df)&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; + geom_point(size=1)&nbsp; &nbsp; &nbsp; &nbsp; + geom_line(aes(y='b', color='"black"')) # Put color in double quotes&nbsp; &nbsp; &nbsp; &nbsp; + geom_line(aes(y='c', color='"blue"'))&nbsp; # Put color in double quotes&nbsp; &nbsp; &nbsp; &nbsp; + ggtitle("TITLE")&nbsp; &nbsp; &nbsp; &nbsp; + labs(y="Y AXIS", x="X AXIS")&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; # Add color scale identity&nbsp; &nbsp; &nbsp; &nbsp; + scale_color_identity(&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; guide='legend',&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; breaks=['black', 'blue'],&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; labels=['Label for black', 'Label for blue']))&nbsp; &nbsp; return plot

牧羊人nacy

我有另一个解决方案,我使用了 melt 将宽数据格式转换为长数据格式。为了生成图例,我们需要为美学映射提供一个分组列,因此使用 melt 我们可以创建一个列标签类别并将其传递给 plotnine 颜色参数。def plot_log_detected():&nbsp; &nbsp; df = DataFrame({'x': [1, 2, 3, 4, 5],&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'b': [22,33,21,66,55],&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'c': [44,11,22,77,55]&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;})&nbsp; &nbsp; long_data = pd.melt(df, id_vars=["x"], value_vars=["b", "c"])&nbsp; &nbsp; long_data = long_data.rename(columns = {'variable':'category'})&nbsp; &nbsp; return ggplot(aes(x='x', y='value', color = "category"), data=long_data) +\&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;geom_point(size=1) +\&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;geom_line() + \&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ggtitle("TITLE") + \&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;labs(y="Y AXIS", x="X AXIS")plot_log_detected()

胡说叔叔

您可以融合您的数据框以将列“b”和“c”合并为一列,并为着色和图例创建一个美学列“颜色”。这是代码和输出。请注意,我将原始数据框用于点图(因为您只在其中绘制“b”列)并将融化的数据框用于线图:def plot_log_detected():&nbsp; &nbsp; df = DataFrame({'x': [1, 2, 3, 4, 5],&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'b': [1, 2, 3, 4, 5],&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'c': [1, 3, 2, 5, 4]&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;})&nbsp; &nbsp; df_melt = df.melt(id_vars=['x'], value_vars=['b','c'], var_name='color', value_name='b_and_c')&nbsp; &nbsp; return ggplot(aes(x='x', y='b'), data=df) + geom_point(size=1) +\&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;geom_line(aes(y='b_and_c', color='color'), data=df_melt) + \&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ggtitle("TITLE") + \&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;labs(y="Y AXIS", x="X AXIS")您的原始示例数据框如下所示:&nbsp; &nbsp;x&nbsp; b&nbsp; c0&nbsp; 1&nbsp; 1&nbsp; 11&nbsp; 2&nbsp; 2&nbsp; 32&nbsp; 3&nbsp; 3&nbsp; 23&nbsp; 4&nbsp; 4&nbsp; 54&nbsp; 5&nbsp; 5&nbsp; 4你融化的数据框是:&nbsp; &nbsp;x color&nbsp; b_and_c0&nbsp; 1&nbsp; &nbsp; &nbsp;b&nbsp; &nbsp; &nbsp; &nbsp; 11&nbsp; 2&nbsp; &nbsp; &nbsp;b&nbsp; &nbsp; &nbsp; &nbsp; 22&nbsp; 3&nbsp; &nbsp; &nbsp;b&nbsp; &nbsp; &nbsp; &nbsp; 33&nbsp; 4&nbsp; &nbsp; &nbsp;b&nbsp; &nbsp; &nbsp; &nbsp; 44&nbsp; 5&nbsp; &nbsp; &nbsp;b&nbsp; &nbsp; &nbsp; &nbsp; 55&nbsp; 1&nbsp; &nbsp; &nbsp;c&nbsp; &nbsp; &nbsp; &nbsp; 16&nbsp; 2&nbsp; &nbsp; &nbsp;c&nbsp; &nbsp; &nbsp; &nbsp; 37&nbsp; 3&nbsp; &nbsp; &nbsp;c&nbsp; &nbsp; &nbsp; &nbsp; 28&nbsp; 4&nbsp; &nbsp; &nbsp;c&nbsp; &nbsp; &nbsp; &nbsp; 59&nbsp; 5&nbsp; &nbsp; &nbsp;c&nbsp; &nbsp; &nbsp; &nbsp; 4最后这是输出图像:
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python