如何用plotly.express.timeline直接基于多列pandas数据绘制甘特图?
使用plotly.express.timeline绘制多日期甘特图:是否无需重塑数据?
核心结论
- plotly.express.timeline不支持直接传入多列作为x_start/x_end参数,它的API设计要求x_start和x_end必须是单个Series(对应长表结构中的每一行任务条目)。因此你必须先将宽表数据转换为长表格式,才能使用该函数生成符合需求的甘特图。
高效数据重塑方法
虽然你提到转换成本高,但可以用pandas的内置函数快速完成转换,代码示例如下:
假设原始DataFrame名为df:
import pandas as pd import plotly.express as px # 原始宽表数据 data = { "Name": ["A", "B", "C"], "day_1_start": ["1:00pm", "11:00am", "10:00am"], "day_1_end": ["3:00pm", "1:00pm", "11:00am"], "day_2_start": ["3:30pm", "3:45pm", "11:30am"], "day_2_end": ["5:30pm", "4:30pm", "4:30pm"] } df = pd.DataFrame(data) # 用wide_to_long快速转换为长表 df_long = pd.wide_to_long( df, stubnames=["day_"], i="Name", j="day", sep="_", suffix=r"\w+" ).reset_index() # 拆分start和end列 df_long[["start", "end"]] = df_long["day_"].str.split("_", expand=True) df_long = df_long.drop("day_", axis=1) # 转换时间格式为datetime(可选,让时间轴更规范) df_long["start"] = pd.to_datetime(df_long["start"], format="%I:%M%p") df_long["end"] = pd.to_datetime(df_long["end"], format="%I:%M%p") # 绘制甘特图,按day区分颜色 fig = px.timeline( df_long, x_start="start", x_end="end", y="Name", color="day", color_discrete_map={1: "#1f77b4", 2: "#ff7f0e"} # 自定义日期颜色 ) # 调整时间轴显示格式 fig.update_layout(xaxis_title="时间", yaxis_title="名称") fig.update_xaxes(tickformat="%I:%M%p") fig.show()
关键说明
- 转换后的长表结构是px.timeline的标准输入格式,每个行代表一个独立的任务时间段,这样才能正确映射到甘特图的每个条形。
- 通过
color="day"参数可以实现不同日期用不同颜色区分,你可以通过color_discrete_map自定义颜色方案。
内容的提问来源于stack exchange,提问作者brebs
相关产品推荐
相关产品推荐

