如何用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
相关产品推荐
相关产品推荐

