如何生成Y轴为Resource的10台机器100任务Scheduling Gantt Chart
解决方案:生成机器调度式甘特图(Y轴为Resource)
核心问题解决思路
ff.create_gantt 默认会将同一Resource下的任务堆叠为阶梯状,且Y轴逻辑不符合调度场景需求。改用Plotly原生的Bar图可以完全自定义任务位置与Y轴映射,避免自动堆叠的问题,同时适配多机器场景。
实现步骤与代码示例
假设你的数据框df包含以下字段:Task(任务名)、Resource(机器标识)、Start(任务开始时间)、End(任务结束时间)。
import plotly.graph_objects as go import pandas as pd # 1. 为每个机器分配固定Y轴位置,确保同一机器的任务在同一Y轴高度 resource_unique = df['Resource'].unique() y_axis_mapping = {res: idx for idx, res in enumerate(resource_unique)} df['y_position'] = df['Resource'].map(y_axis_mapping) # 2. 构建调度甘特图 fig = go.Figure() # 逐个添加任务条形 for _, task in df.iterrows(): fig.add_trace(go.Bar( x=[task['End'] - task['Start']], # 任务持续时长 y=[task['y_position']], base=task['Start'], # 任务开始时间 width=0.4, # 条形宽度,适配多任务显示 marker=dict(color=task.get('Color', '#1f77b4')) # 支持自定义任务颜色 )) # 3. 调整布局,设置Y轴为机器标识 fig.update_layout( xaxis_title="时间", yaxis_title="机器(Resource)", yaxis=dict( tickmode="array", tickvals=list(y_axis_mapping.values()), ticktext=list(y_axis_mapping.keys()), autorange="reversed" # 可选:让第一台机器显示在图表顶部 ), barmode="overlay", # 关键:同一机器的任务按时间重叠显示,而非堆叠 autosize=False, width=800, height=400, # 可根据机器数量调整,10台机器设400足够,更多机器可适当调高 showlegend=False # 任务数量过多时建议关闭图例 ) fig.show()
方案优势
- 完全规避
ff.create_gantt的阶梯状堆叠问题,同一机器的任务按时间轴正常排列 - Y轴直接绑定机器标识,符合调度甘特图的展示逻辑
- 相比Matplotlib方案,可通过调整
height参数灵活适配机器数量,不会出现图表过度拉伸的情况,同时支持交互缩放查看细节
内容的提问来源于stack exchange,提问作者user21559
相关产品推荐
相关产品推荐

