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

Python中如何从含多轨迹的Plotly图(如splom)提取单条轨迹?

实现方法

Plotly 原生没有提供示例中GET_ME_A_TRACE()这类命名的内置方法,但可以通过简单的轨迹筛选逻辑实现完全一致的效果。

核心原理

所有Plotly多子图(包含splom散点矩阵)的轨迹都存储在fig.data列表中,每个轨迹的xaxis、yaxis属性记录了它绑定的子图坐标轴,通过坐标轴编号和行列位置的映射关系,就能精准筛选出目标位置的轨迹。
如果是通过plotly.subplots.make_subplots显式创建的子图,还可以直接调用内置的select_traces()方法按行列筛选,不需要手动计算映射关系。

可直接复用的代码

通用版本(兼容散点矩阵等所有多子图场景)

这个函数和你预期的调用方式完全一致,支持按传入的行、列号(从1开始计数)提取对应子图的轨迹,生成独立的新图:

import plotly.graph_objects as go
import plotly.express as px

def get_trace_by_pos(fig, row, col):
    # 计算子图网格总列数
    all_xaxis_idx = []
    for trace in fig.data:
        xaxis_tag = trace.xaxis.replace('x', '').replace('axis', '')
        all_xaxis_idx.append(int(xaxis_tag) if xaxis_tag else 1)
    total_cols = max(all_xaxis_idx)
    
    # 匹配当前行列对应的坐标轴标识
    axis_idx = (row - 1) * total_cols + col
    target_x = 'x' if axis_idx == 1 else f'x{axis_idx}'
    target_y = 'y' if axis_idx == 1 else f'y{axis_idx}'

    # 筛选目标位置的所有轨迹
    target_traces = [t for t in fig.data if t.xaxis == target_x and t.yaxis == target_y]

    # 生成独立子图,同步原坐标轴标题
    sub_fig = go.Figure(data=target_traces)
    sub_fig.update_layout(
        xaxis_title=fig.layout[f'xaxis{axis_idx}'].title.text,
        yaxis_title=fig.layout[f'yaxis{axis_idx}'].title.text
    )
    return sub_fig

# 测试示例
df = px.data.iris()
fig = px.scatter_matrix(df)
sub_fig = get_trace_by_pos(fig, row=1, col=1)
sub_fig.show()

显式创建子图的简化写法

如果你的图是通过make_subplots创建的,不需要自定义函数,直接用内置方法即可:

from plotly.subplots import make_subplots
# 假设fig是通过make_subplots生成的多子图
target_traces = list(fig.select_traces(row=1, col=1))
sub_fig = go.Figure(data=target_traces)
sub_fig.show()

补充说明

  • 如果对应子图下叠加了多条轨迹(比如散点+拟合线),上述方法会提取该位置的所有轨迹;如果只需要其中某一条,直接在返回的轨迹列表里按索引取值即可
  • 提取出的新图可以正常调用update_layout、update_traces等方法调整样式,和普通Plotly图没有区别

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 09:03:50