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

非Tidy Data场景下,如何为Plotnine多平滑曲线添加图例?

在plotnine中为同一数据集的多条KDE曲线添加图例

我来帮你解决这个plotnine里的图例问题!你遇到的报错是因为plotnine对aes()映射的解析逻辑和ggplot2略有不同——在plotnine的aes()里,直接写color='red'会被当作数据框的列名来查找,而不是字面意义上的颜色值,所以它找不到名为red的列就报错了。下面给你两种可行的解决方案:

方案1:用I()标记颜色字面量(快速修改原有代码)

你可以用I()函数把颜色值包裹起来,告诉plotnine这是一个直接的颜色值,而非数据列。再配合scale_color_identity来设置图例的标签和标题:

from plotnine import *
from plotnine.data import *

(ggplot(faithful, aes(x='waiting')) 
 + geom_line(aes(color=I('red')), stat='density', adjust=0.5) 
 + geom_line(aes(color=I('blue')), stat='density')  # 默认adjust=1
 + geom_line(aes(color=I('green')), stat='density', adjust=2) 
 + labs(title='Effect of varying KDE smoothing parameter', 
        x='Time to next eruption (min)', 
        y='Density') 
 + scale_color_identity(
     guide='legend',
     labels=['adjust=0.5', 'adjust=1', 'adjust=2']  # 对应每条曲线的标签
 )
 + guides(color=guide_legend(title='Smoothing Parameter'))  # 设置图例标题
)

这里的I()是"identity"的缩写,作用是让plotnine直接使用传入的字面量值,而不是去数据框里查找对应列。

方案2:整理为tidy数据格式(更推荐,易扩展)

虽然你提到所有曲线基于同一数据集,但我们可以先把不同平滑参数的KDE结果提前计算出来,整理成tidy格式的DataFrame,再用单个geom_line绘图。这种方法更简洁,也更容易扩展到更多平滑参数:

import pandas as pd
from plotnine import *
from plotnine.data import *

# 定义函数,生成指定adjust参数的密度数据
def generate_kde_data(df, x_col, adjust_val):
    # 生成密度曲线并提取数据
    kde_line = df[x_col].plot.density(adjust=adjust_val).get_lines()[0]
    return pd.DataFrame({
        'waiting': kde_line.get_xdata(),
        'density': kde_line.get_ydata(),
        'smoothing_param': f'adjust={adjust_val}'  # 添加参数标签列
    })

# 生成所有需要的参数数据并合并
adjust_params = [0.5, 1, 2]
kde_df = pd.concat([generate_kde_data(faithful, 'waiting', p) for p in adjust_params])

# 绘图,自动生成图例
(ggplot(kde_df, aes(x='waiting', y='density', color='smoothing_param')) 
 + geom_line() 
 + labs(title='Effect of varying KDE smoothing parameter', 
        x='Time to next eruption (min)', 
        y='Density') 
 + scale_color_manual(values=['red', 'blue', 'green'])  # 指定对应颜色
)

这种方法的优势在于:只需要一次geom_line调用,图例自动生成,后续如果要增加更多平滑参数,只需要修改adjust_params列表即可,代码维护性更强。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 09:37:38