如何用Plotly基于散点图数据绘制折线图?(附DataFrame示例)
Plotly绘制ID进度折线图方案
解决方案步骤
1. 数据格式转换
原始数据为宽格式(每个ID一行,包含三个时间节点),需转成长格式才能让Plotly正确绘制每个ID的连续折线。长格式下每个ID对应三行数据,分别记录start、step1、step2的天数和对应阶段。
2. 代码实现
import pandas as pd import plotly.express as px # 示例数据(替换为你的实际DataFrame) df = pd.DataFrame({ 'id': ['a', 'b', 'c'], 'start': [0, 0, 0], 'step1': [10, 5, 1], 'step2': [27, 45, 11] }) # 转换为长格式,提取每个阶段的天数 long_df = pd.melt(df, id_vars='id', var_name='stage', value_name='day') # 给阶段设置排序值,保证折线按start→step1→step2的顺序绘制 long_df['stage_order'] = long_df['stage'].map({'start': 0, 'step1': 1, 'step2': 2}) long_df = long_df.sort_values(['id', 'stage_order']) # 绘制折线图 fig = px.line( long_df, x='day', # X轴:从start开始的天数 y='stage_order', # Y轴:阶段的排序值 color='id', # 按ID区分线条颜色 markers=True, # 显示每个阶段的标记点 labels={'day': '天数(从start开始)', 'stage_order': '阶段'} ) # 替换Y轴刻度为阶段名称,提升可读性 fig.update_yaxes(tickvals=[0, 1, 2], ticktext=['start', 'step1', 'step2']) # 调整布局样式 fig.update_layout( title='各ID进度折线图', xaxis_title='天数', yaxis_title='阶段' ) fig.show()
3. 关键说明
- 之前使用
strip、scatter方法失败,是因为这两个方法仅能绘制离散点,无法自动连接同一ID的多个时间节点形成折线。 - 转长格式是核心操作,确保Plotly能识别每个ID对应的连续时间序列。
- 通过
stage_order控制折线顺序,避免因阶段名称的字母排序导致折线逻辑混乱。
内容的提问来源于stack exchange,提问作者charnould
相关产品推荐
相关产品推荐

