我在剧情上遇到了麻烦,无法自定义图例,超出了通过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
中的所有数据点?
图例是自动的。您可以影响它的唯一方法是更改data
,aes
映射或scale
参数。问题是您正在尝试创建具有不同映射的图层,但期望它们共享图例。
有没有更好的解决方案来保持 df2 的所有数据点为黑色,同时在图例中仅作为黑点出现一次?
解决方案是将数据操作成一个连贯的整体,或者确保不同的数据帧具有映射到相同美学的相似列(您似乎已经在第二个 df2 中做到了这一点)。然后,如果要控制图例中的颜色,则应使用手动刻度。
+ scale_color_manual(['red', 'cyan', 'black'])
其次,有没有办法在图例中添加一个黑色方块来表示 df3 中的所有数据点?
没有办法做到这一点。
关键的一点是,图例是理解数据的指南,如果你有操纵其中显示的项目的冲动,那么数据很可能没有被正确组织。此外,如果要标记"特殊"点,请使用注释。