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

如何用Plotly绘制按机器分组的多任务交互式甘特图

实现方法

你可以直接用Plotly的graph_objects.Bar构建符合需求的甘特图,相比figure_factories更灵活,能完美适配整数起止时间,具体步骤如下:

1. 导入依赖库

import pandas as pd
import plotly.graph_objects as go

2. 加载数据集(已有DataFrame可跳过此步)

data = {
    "Job": ["A", "A", "B", "B", "B", "C"],
    "Task": ["Do X", "Do Y", "Do Q", "Do Z", "Do X", "Do Y"],
    "Machine": [1, 2, 3, 3, 1, 1],
    "Start": [0, 6, 0, 9, 14, 6],
    "End": [5, 14, 8, 12, 17, 9],
    "color": ["blue", "blue", "green", "green", "green", "red"]
}
df = pd.DataFrame(data)

3. 绘制甘特图

# 创建空白画布
fig = go.Figure()

# 遍历每个任务添加条形
for idx, row in df.iterrows():
    fig.add_trace(go.Bar(
        y=[row["Machine"]],
        x=[row["End"] - row["Start"]],
        base=row["Start"],
        marker_color=row["color"],
        hovertemplate=f"{row['Job']} - {row['Task']}, {row['Start']} - {row['End']}<extra></extra>",
        showlegend=False
    ))

# 调整布局细节
fig.update_layout(
    title="机器任务甘特图",
    xaxis_title="时间",
    yaxis_title="机器",
    yaxis=dict(
        tickmode="array",
        tickvals=sorted(df["Machine"].unique()),
        ticktext=[f"机器 {m}" for m in sorted(df["Machine"].unique())]
    ),
    barmode="overlay"
)

# 展示图表
fig.show()

关键说明

  • 用base参数设置任务起始时间,x参数设置任务持续时长(End-Start),实现横向条形的时间定位
  • hovertemplate直接定义悬停提示内容,完全匹配Job - Task, Start - end的格式要求
  • 自动按机器分组展示任务,同一机器上的任务会按时间顺序排列
  • 直接调用DataFrame中的color列设置条形颜色,无需额外映射

如果一定要用px.timeline,可以将整数时间转换为timedelta类型(适配px.timeline的时间轴要求),示例代码如下:

import plotly.express as px

# 转换时间列为timedelta类型
df["Start_delta"] = pd.to_timedelta(df["Start"], unit="h")
df["End_delta"] = pd.to_timedelta(df["End"], unit="h")

fig = px.timeline(
    df,
    y="Machine",
    x_start="Start_delta",
    x_end="End_delta",
    color_discrete_sequence=df["color"],
    hover_data={"Job": True, "Task": True, "Start": True, "End": True, "Start_delta": False, "End_delta": False}
)

# 自定义悬停模板
fig.update_traces(
    hovertemplate="%{customdata[0]} - %{customdata[1]}, %{customdata[2]} - %{customdata[3]}<extra></extra>"
)

# 调整Y轴显示文本
fig.update_yaxes(tickmode="array", tickvals=sorted(df["Machine"].unique()), ticktext=[f"机器 {m}" for m in sorted(df["Machine"].unique())])

fig.show()

两种方案都能实现需求,推荐使用graph_objects.Bar的方案,无需转换时间格式,逻辑更直观。

内容的提问来源于stack exchange,提问作者Gerard L

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 02:22:42