Plotly graph_objects:如何根据变量值为线条着色?
解决Plotly多条轨迹按连续色标统一着色的问题
问题根源
你的代码存在两个核心问题:
- 轨迹用
mode='lines'渲染,但你设置的是marker.color(控制散点颜色),而非line.color(控制线条颜色) - 传递给
color的是整个vals数组,而非当前轨迹对应的单个vals[i]值,导致颜色映射逻辑完全错误
修正方案
使用Plotly内置的colors.sample_colorscale工具,根据每条轨迹对应的vals[i]值,从指定色标中提取精确匹配的颜色,再赋值给线条颜色。
修正后的代码
import plotly.graph_objects as go import numpy as np from plotly.colors import sample_colorscale data = np.array([ [0, 1, 2, 3, 4, 5], [0, 1.1, 2.1, 3.1, 4.1, 5.1], [1, 2, 3, 4, 5, 6], [2, 3, 4, 5, 6, 7], [2, 3.1, 4.1, 5.1, 6.1, 7.1], [3, 4, 5, 6, 7, 8] ]) # 每行对应一条轨迹的y值 vals = [0, 0, 1, 2, 2, 3] # 每条轨迹对应的色标映射值 nums = [1, 2, 3, 4, 5] # x轴数值 # 定义色标参数 colorscale = 'Viridis' cmin = 0 cmax = 3 fig = go.Figure() for i, row in enumerate(data): # 将当前值归一化到0-1区间,适配色标映射规则 norm_val = (vals[i] - cmin) / (cmax - cmin) # 从指定色标中提取对应颜色 line_color = sample_colorscale(colorscale, norm_val)[0] # 添加轨迹并设置线条颜色 fig.add_trace(go.Scatter( x=nums, y=row, name=str(vals[i]), mode='lines', line=dict(color=line_color) )) # 可选:添加颜色条,展示色标与数值的对应关系 fig.update_layout( coloraxis=dict( colorscale=colorscale, cmin=cmin, cmax=cmax, colorbar=dict(title='色标值') ) ) fig.show()
效果说明
- 相同
vals[i]值的轨迹会获得完全一致的颜色:前两条轨迹对应Viridis色标的紫色,第四、五条对应同一中间色,第六条对应色标最大值的黄色 - 若不需要展示颜色条,可删除
update_layout部分的配置
内容的提问来源于stack exchange,提问作者sean412
相关产品推荐
相关产品推荐

