【问题标题】:Creating a custom legend in plotnine在 plotnine 中创建自定义图例
【发布时间】:2018-01-30 12:36:35
【问题描述】:

我在通过 aes() 无法自定义图例时遇到问题

我有以下代码:

import pandas as pd
from plotnine import *

data1 = {'dilution': [2.000000, 2.477121, 2.954243, 3.431364, 3.908485, 4.385606, 4.862728, 5.339849, 5.816970, 2.000000, 2.477121, 2.954243, 3.431364, 3.908485, 4.385606, 4.862728, 5.339849, 5.816970],
'variable': ["mouse 1", "mouse 1", "mouse 1", "mouse 1", "mouse 1", "mouse 1", "mouse 1", "mouse 1", "mouse 1", "mouse 2", "mouse 2", "mouse 2", "mouse 2", "mouse 2", "mouse 2", "mouse 2", "mouse 2", "mouse 2"],
'value': [547.180708, 495.883622, 439.109089, 277.819313, 115.926188, 42.041189, 15.276367, 11.696537, 2.280014, 269.398164, 233.667531, 215.410352, 169.512070, 102.877518, 36.860550, 13.960504, 4.891481, -3.465304]}
df1 = pd.DataFrame.from_dict(data1)
data2 = {'dilution': [2.0, 2.0, 2.0],
'value': [-7.873768, -3.926121, 4.170833] }
df2 = pd.DataFrame.from_dict(data2)

data3 = {'dilution': [3.90309, 3.90309],
'value': [756.715198, 540.613828],
'variable': ["mouse 1", "mouse 2"]}
df3 = pd.DataFrame.from_dict(data3)

g = (ggplot(df1)
+ geom_line(aes(x='dilution', y='value', color='variable'), data=df1, size=1.0)
+ geom_point(aes(x='dilution', y='value', color='variable'), data=df1, size=1.0)
+ geom_point(aes(x='dilution', y='value'), data=df2, size=3.0)
+ geom_point(aes(x='dilution', y='value', color='variable'), data=df3, size=2.0, shape='s')
+ scale_x_continuous( )
)
print(g)

生成以下图表:

example plotnine with black data points

如您所见,来自df2 的数据点没有出现在图例中。我希望图例中的一个黑点代表来自df2 的所有点。如果我将data2 更改如下,我可以在图例中显示它:

data2 = {'dilution': [2.0, 2.0, 2.0],
'value': [-7.873768, -3.926121, 4.170833],
'type': ['test', 'test', 'test']}

然后将其映射到美学如下:geom_point(aes(x='dilution', y='value', color='type'), data=df2, size=3.0)

但是这些点不再是黑色的,我似乎无法再次将这些点改回黑色。添加 color='black' 参数不起作用:

example plotting with coloured legend points

有没有更好的解决方案来保持df2 的所有数据点为黑色,而在图例中只出现一次作为黑色点?

其次,有没有办法在图例中添加一个黑色方块来表示来自df3的所有数据点?

【问题讨论】:

    标签: python pandas plotnine


    【解决方案1】:

    图例是自动的。影响它的唯一方法是更改​​dataaes 映射或scale 参数。问题是您正在尝试创建具有不同映射的图层,但希望它们共享图例。

    有没有更好的解决方案来保持 df2 的所有数据点为黑色,同时在图例中只出现一次作为黑点?

    解决方案是将数据处理成一个连贯的整体,或者确保不同的数据帧具有映射到相同美学的相似列(您似乎已经使用第二个 df2 完成了此操作)。那么如果你想控制图例中的颜色,你应该使用手动比例。

    + scale_color_manual(['red', 'cyan', 'black'])
    

    其次,有没有办法在图例中添加一个黑色方块来表示来自 df3 的所有数据点?

    没有办法做到这一点。

    关键的一点是,图例是理解数据的指南,如果您有想要操纵其中显示的项目的冲动,那么数据很可能没有正确组织。此外,如果您想标记“特殊”点,请使用注释。

    【讨论】:

    • 有没有办法获取默认颜色数组?例如,如果我只想更改图例标签,但保留原始颜色,我发现我必须指定颜色的值,而不是仅使用 scale_color_manual 中的标签来更改标签。换句话说,我需要使用+ scale_color_manual(values=get_orginal_cmap, labels=new_label_list) 而不是+ scale_color_manual(labels=new_label_list)
    • 看来scale_color_hue(labels=new_label_list) 是解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-02
    • 2012-03-02
    • 2013-06-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多