You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

plotnine自定义图例问题:为df2加黑点图例、为df3加黑方块图例

我来帮你解决plotnine中图例自定义的问题,你需要让df2的黑点和df3的黑方块都出现在图例里,同时保持它们的黑色样式,下面是具体的解决方案和代码:

核心思路

要实现你的需求,我们需要给df2和df3添加统一的分组标识,将它们映射到color和shape美学属性,再通过手动指定颜色和形状来锁定黑色样式,最后合并图例让展示更清晰。

完整修改代码

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)

# 给df2和df3添加分组列,用于生成独立图例项
df2['group'] = 'Background'
df3['group'] = 'Control'

# 绘制图表
g = (ggplot()
     # 保留原有的mouse系列折线和圆点
     + 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)
     # 绘制Background黑点,映射color和shape到group
     + geom_point(aes(x='dilution', y='value', color='group', shape='group'), data=df2, size=3.0)
     # 绘制Control黑方块,映射color和shape到group
     + geom_point(aes(x='dilution', y='value', color='group', shape='group'), data=df3, size=2.0)
     # 手动指定颜色:锁定Background和Control为黑色,保留mouse系列默认色
     + scale_color_manual(values={
         'mouse 1': '#1f77b4',
         'mouse 2': '#ff7f0e',
         'Background': 'black',
         'Control': 'black'
     })
     # 手动指定形状:Control用方块,其余用圆点
     + scale_shape_manual(values={
         'mouse 1': 'o',
         'mouse 2': 'o',
         'Background': 'o',
         'Control': 's'
     })
     # 合并color和shape图例,统一标题让展示更整洁
     + labs(color='Sample Type', shape='Sample Type')
     # 可选:调整图例位置
     + theme(legend_position='right')
)

print(g)

关键步骤解释

  1. 添加分组列:给df2和df3分别添加group列,让它们成为独立的图例类别,这样df3的两个点会统一归到"Control"组,实现单个图例项代表所有df3数据。
  2. 映射美学属性:将df2和df3的group同时映射到color和shape,确保plotnine为它们生成图例项。
  3. 锁定颜色和形状:通过scale_color_manual强制设置黑色,用scale_shape_manual指定Control为方块,解决你之前映射后无法改回黑色的问题。
  4. 合并图例:将color和shape的图例标题设为一致,plotnine会自动合并两个图例,让每个项同时显示对应的颜色和形状。

最终图例会包含四个清晰的项:mouse1(蓝点)、mouse2(橙点)、Background(黑点)、Control(黑方块),完全符合你的需求。

内容的提问来源于stack exchange,提问作者Simon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:38:52