1

我无法通过 plotnine 自定义图例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)

这会产生以下图表:

带有黑色数据点的示例 plotnine

如您所见,来自的数据点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'参数不起作用:

使用彩色图例点绘制的示例

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

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

4

1 回答 1

2

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

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

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

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

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

没有办法做到这一点。

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

于 2018-02-02T06:17:48.390 回答