Plotly Scatter折线图条件着色失效问题求助
解决Plotly折线图条件着色问题
Plotly的Scatter组件在mode="lines"模式下,line.color不支持直接传入颜色列表(仅支持单一颜色或关联颜色轴),因此原散点图的条件着色方法无法直接复用。要在单个Scatter对象中实现y值大于600的对应线段显示红色的需求,可通过构造连续分段线段数据+颜色轴映射的方式实现:
实现步骤
- 判断每一段相邻点连线的条件:只要线段两端任意一个点的y值大于600,该线段设为红色,否则为蓝色。
- 拼接连续折线数据(重复端点保证折线连续),同时生成对应线段的颜色映射数值。
- 通过
coloraxis将数值映射到指定颜色,关联到折线的颜色属性。
完整代码
import plotly.graph_objects as go import pandas as pd df = pd.DataFrame({ "x": [1, 2, 3, 4, 5, 6, 7], "y": [200, 400, 100, 800, 500, 200, 1100] }) # 定义每段线段的颜色:线段两端任一y>600则为红色,否则蓝色 segment_colors = [] for i in range(len(df)-1): if df['y'].iloc[i] > 600 or df['y'].iloc[i+1] > 600: segment_colors.append('red') else: segment_colors.append('blue') # 构造连续折线数据(重复端点保证线段连续),以及对应的颜色映射数值 x_lines = [] y_lines = [] color_vals = [] color_map = {'blue': 0, 'red': 1} # 将颜色映射为数值,用于关联颜色轴 for i in range(len(df)-1): x_lines.extend([df['x'].iloc[i], df['x'].iloc[i+1]]) y_lines.extend([df['y'].iloc[i], df['y'].iloc[i+1]]) color_vals.extend([color_map[segment_colors[i]], color_map[segment_colors[i]]]) # 创建单个Scatter对象,通过颜色轴实现条件着色 fig = go.Figure(go.Scatter( x=x_lines, y=y_lines, mode="lines", color=color_vals, line=dict(coloraxis="coloraxis"), showlegend=False )) # 配置颜色轴:隐藏刻度,映射数值到对应颜色 fig.update_layout( coloraxis=dict( colorscale=[[0, 'blue'], [1, 'red']], showscale=False ) ) fig.show()
效果说明
运行代码后,连接x=3-x=4(y从100到800)、x=4-x=5(y从800到500)、x=6-x=7(y从200到1100)的线段会显示为红色,其余线段为蓝色,完全符合需求且仅使用了单个Scatter对象。
内容的提问来源于stack exchange,提问作者eNath
相关产品推荐
相关产品推荐

