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

非DataFrame数据下,Plotly Express中如何为px.line添加图例标签?

在Plotly Express中为非DataFrame数据的折线图添加图例名称

问题原因

Plotly Express(PX)的设计核心是基于DataFrame的结构化数据,当直接传入单组x、y数组调用px.line时,API并未暴露name参数来指定轨迹名称;而add_scatter属于Plotly Graph Objects层面的方法,因此支持name参数,这就导致你的示例中只有第二条轨迹显示图例名称。

解决方案

以下两种方法可以在不切换到Plotly Graph Objects的前提下解决问题:

方法1:直接修改现有轨迹的名称

px.line生成的图表对象中已经包含一条轨迹,你可以直接通过索引访问并修改它的name属性:

import plotly.express as px 
import numpy as np

# 模拟训练历史数据
history_dict = {"loss": np.random.rand(20), "val_loss": np.random.rand(20)}

p1 = px.line(
    x = np.arange(0,20),
    y = history_dict["loss"],
    title = "Training and Validation Loss",   
)

# 为第一条轨迹设置图例名称
p1.data[0].name = "train loss"

p1.add_scatter(
    x = np.arange(0,20),
    y = history_dict["val_loss"],
    mode = "lines",
    name = "val loss"
)

p1.update_layout(xaxis_title = "epochs", yaxis_title = "loss")
p1.show()

方法2:将数据转换为DataFrame(Plotly Express推荐方式)

如果允许调整数据格式,将数组转换为DataFrame的长格式,就能利用PX原生的color参数自动生成带名称的图例,更符合PX的设计逻辑:

import plotly.express as px 
import numpy as np
import pandas as pd

history_dict = {"loss": np.random.rand(20), "val_loss": np.random.rand(20)}

# 构造长格式DataFrame
df = pd.DataFrame({
    "epochs": np.tile(np.arange(0,20), 2),
    "loss": np.concatenate([history_dict["loss"], history_dict["val_loss"]]),
    "loss_type": ["train loss"]*20 + ["val loss"]*20
})

p1 = px.line(
    df,
    x = "epochs",
    y = "loss",
    color = "loss_type",
    title = "Training and Validation Loss",
    labels = {"epochs": "epochs", "loss": "loss", "loss_type": "Loss Type"}
)
p1.show()

总结

  • 若不想修改原始数据结构,直接修改p1.data[0].name是最快捷的方式;
  • 若后续需要添加更多数据组,转换为DataFrame的长格式能让图表维护更便捷。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 12:46:57