You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 07:03:17