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

如何独立设置Plotly图例项颜色?附布尔数组可视化示例

问题描述

我想用Plotly的Scatter轨迹可视化多个布尔数组,以时间戳为x轴、数组索引为y轴,通过颜色区分数值。但发现图例项的颜色始终对应轨迹的第一个元素,请问是否可以独立设置图例项的颜色?

复现问题的最小示例代码:

from plotly import graph_objects as go
import numpy as np

data = np.random.randint(0,2,(3, 50))

traces = [
    go.Scatter(
        x = np.arange(len(line)),
        y = np.ones(len(line)) * i,
        mode='markers',
        marker={
            'color': line,
            'cmin': 0,
            'cmax': 1,
            'colorscale': [[0, 'red'], [1, 'green']]
        },
    ) for i, line in enumerate(data)
]

fig = go.Figure(traces)
fig.show()

示例效果:
示例图


解决方法

当Scatter轨迹的marker.color设为数组时,Plotly默认取轨迹第一个点的颜色作为图例项颜色,无法直接让单个轨迹图例展示多种颜色。以下两种方案可实现独立控制图例颜色:

方案1:隐藏原轨迹图例,添加自定义统一图例

将所有原始轨迹的图例隐藏,手动添加两个空的Scatter轨迹作为自定义图例,分别对应0(红色)和1(绿色):

from plotly import graph_objects as go
import numpy as np

data = np.random.randint(0,2,(3, 50))

traces = [
    go.Scatter(
        x = np.arange(len(line)),
        y = np.ones(len(line)) * i,
        mode='markers',
        marker={
            'color': line,
            'cmin': 0,
            'cmax': 1,
            'colorscale': [[0, 'red'], [1, 'green']]
        },
        showlegend=False  # 隐藏原轨迹的图例项
    ) for i, line in enumerate(data)
]

fig = go.Figure(traces)

# 添加自定义图例项
fig.add_trace(go.Scatter(
    x=[None], y=[None],
    mode='markers',
    marker=dict(color='red', size=10),
    name='值为0'
))
fig.add_trace(go.Scatter(
    x=[None], y=[None],
    mode='markers',
    marker=dict(color='green', size=10),
    name='值为1'
))

fig.show()

方案2:按数值拆分轨迹(区分每个索引下的不同值)

将每个数组中的0和1元素拆分为独立轨迹,分别设置颜色和图例名称,适合需要明确区分每个索引下不同数值的场景:

from plotly import graph_objects as go
import numpy as np

data = np.random.randint(0,2,(3, 50))

traces = []
for i, line in enumerate(data):
    # 提取值为0的点并创建轨迹
    idx_0 = np.where(line == 0)[0]
    traces.append(go.Scatter(
        x=idx_0,
        y=np.ones(len(idx_0)) * i,
        mode='markers',
        marker=dict(color='red'),
        name=f'索引{i} - 值为0'
    ))
    # 提取值为1的点并创建轨迹
    idx_1 = np.where(line == 1)[0]
    traces.append(go.Scatter(
        x=idx_1,
        y=np.ones(len(idx_1)) * i,
        mode='markers',
        marker=dict(color='green'),
        name=f'索引{i} - 值为1'
    ))

fig = go.Figure(traces)
fig.show()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 00:05:20