如何独立设置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
相关产品推荐
相关产品推荐

