如何用Plotly绘制单条随c1值变色的连续折线图?
实现Plotly单条连续折线按c1值切换颜色
当使用Plotly Express的px.line()并设置color='c1'时,Plotly会将不同c1值的数据拆分为独立折线,无法实现单条连续折线按c1切换颜色的需求。要解决这个问题,我们可以使用Plotly Graph Objects手动构建折线,将连续相同c1值的线段作为单独的trace绘制,确保整体折线连续。
解决方案步骤
- 为连续相同的c1值分组:通过判断相邻行
c1值是否变化,生成分组ID,确保每个分组内的c1值连续相同。 - 手动添加折线Trace:遍历每个分组,为每个分组添加一条折线Trace,使用对应
c1值的颜色,相邻分组的折线会自然连接,形成整体连续的折线。 - 自定义颜色映射:根据
c1的不同值(-1、0、1)设置对应的颜色,提升可视化区分度。
完整代码示例
import pandas as pd import plotly.graph_objects as go # 测试数据 data = { "date": ['2021/01/07', '2021/01/08', '2021/01/11', '2021/01/12','2021/01/13','2021/01/14','2021/01/15'], "p1": [2, 4, 6, 6,4, 2,2], "c1":[0,1,1,0,-1,-1,0] } df = pd.DataFrame(data) df['date1'] = pd.to_datetime(df['date']) # 为连续相同的c1值生成分组ID df['group_id'] = df['c1'].ne(df['c1'].shift()).cumsum() # 定义c1对应的颜色映射 color_map = {-1: '#ff4d4d', 0: '#808080', 1: '#33cc33'} # 初始化Figure fig = go.Figure() # 遍历每个分组,添加折线Trace for group in df.groupby('group_id'): group_data = group[1] c1_val = group_data['c1'].iloc[0] fig.add_trace(go.Scatter( x=group_data['date1'], y=group_data['p1'], mode='lines+markers', # 可选保留标记点,方便查看数据点 line=dict(color=color_map[c1_val], width=2), name=f'c1={c1_val}' )) # 调整布局 fig.update_layout( xaxis_title='日期', yaxis_title='P1', title='P1趋势(按c1切换颜色)', hovermode='x unified' ) fig.show()
代码说明
- 分组逻辑:
df['c1'].ne(df['c1'].shift()).cumsum()会在c1值变化时生成新的分组ID,保证每个分组内的c1值连续一致。 - 颜色映射:
color_map自定义了不同c1值对应的颜色,你可以根据需求调整颜色代码。 - Trace添加:每个分组对应一个Trace,由于分组是连续的,相邻Trace的终点和起点会自然连接,形成单条连续折线,同时不同段的颜色由
c1值决定。
内容的提问来源于stack exchange,提问作者newoptionz
相关产品推荐
相关产品推荐

