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

如何向Plotly px.scatter传递列名列表实现多轨迹绘图?

Plotly Express px.scatter 实现多Y列轨迹并按分组着色

需求说明

需要将包含pandas列名的列表传递给px.scatter的y参数,在同一张图中生成对应数量的轨迹,同时通过color参数按指定列(如Frame)分组着色。此前已用Plotly Go实现该功能,希望用Plotly Express简化开发并保留着色能力。

可运行的Plotly Go代码

import plotly.graph_objects as go

fig = go.Figure()
for name in y_name:
    fig.add_trace(go.Scatter(x=dff['X'],
                             y=dff[name],
                             mode='markers',
                             name=name))
    fig.update_xaxes(title='X')
    fig.update_yaxes(title=name)

原错误的Plotly Express代码

import plotly.express as px

fig = px.scatter(dff,
                 x=dff['X'],
                 y=dff[y_name],
                 color=dff['Frame'])
fig.update_xaxes(title='X')
fig.update_yaxes(title=y_name)

问题原因

Plotly Express的px.scatter默认适配长格式(long-form)数据,而原代码传入的是宽格式数据的多列列表,不符合Express的数据结构要求,导致无法解析生成多条轨迹。

正确实现方法

先通过pandas的melt函数将宽格式数据转换为长格式,再传入px.scatter:

步骤1:转换数据格式

# 将宽格式转为长格式,保留X和Frame作为标识列,y_name中的列转为值列
df_long = dff.melt(
    id_vars=['X', 'Frame'],  # 不需要转换的列
    value_vars=y_name,       # 需要转换的Y列列表
    var_name='Y_Column',     # 存储原Y列名的新列名
    value_name='Y_Value'     # 存储原Y列值的新列名
)

步骤2:用Plotly Express生成图表

fig = px.scatter(
    df_long,
    x='X',
    y='Y_Value',
    color='Frame',          # 按Frame列分组着色
    symbol='Y_Column',      # 用不同标记区分不同Y列的轨迹
    labels={                # 自定义轴标签
        'X': 'X',
        'Y_Value': 'Y Values'
    }
)
fig.update_layout(title='多Y列散点图(按Frame着色)')
fig.show()

效果说明

转换后的数据结构让Plotly Express能自动识别Y_Column作为轨迹分组依据,结合color='Frame'实现同一Y列下不同分组的着色,同时用symbol区分不同Y列的轨迹,最终效果与Plotly Go代码一致,且保留了Express的便捷分组能力。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 11:15:44