用python写出生成甘特图的代码
时间: 2023-05-23 19:04:48 浏览: 211
以下是用Python写出生成甘特图的代码的示例:
```python
import plotly.express as px
import pandas as pd
# 定义数据集
df = pd.DataFrame([
dict(Task="任务1", 开始='2022-01-01', 完成='2022-01-31'),
dict(Task="任务2", 开始='2022-03-01', 完成='2022-04-15'),
dict(Task="任务3", 开始='2022-06-01', 完成='2022-06-30')
])
# 生成甘特图
fig = px.timeline(df, x_start="开始", x_end="完成", y="Task")
# 显示图表
fig.show()
```
这段代码首先引入了`plotly`和`pandas`库,然后定义了一个包含任务、开始时间和结束时间的数据集,创建了一个甘特图用于可视化数据,最后通过`fig.show()`方法将图表显示出来。您可以根据需要修改任务和时间的数据以及其他图表属性来自定义并生成甘特图。
相关问题
用Python写一个甘特图的代码
很高兴为您提供帮助!下面是一个使用Python绘制甘特图的示例代码:
```python
import matplotlib.pyplot as plt
import datetime
# 任务名称
task_names = ['任务1', '任务2', '任务3', '任务4']
# 任务开始结束时间
task_start_dates = [datetime.datetime(2021, 9, 1, 8, 0), datetime.datetime(2021, 9, 10, 13, 0),
datetime.datetime(2021, 9, 20, 12, 0), datetime.datetime(2021, 9, 25, 16, 0)]
task_end_dates = [datetime.datetime(2021, 9, 4, 18, 0), datetime.datetime(2021, 9, 13, 8, 0),
datetime.datetime(2021, 9, 23, 16, 0), datetime.datetime(2021, 9, 27, 18, 0)]
# 设置甘特图的样式
fig, ax = plt.subplots()
plt.title("甘特图示例")
plt.xlabel("时间")
plt.ylabel("任务")
plt.grid(True)
# 绘制水平条形图
for i in range(len(task_names)):
start_date = task_start_dates[i]
end_date = task_end_dates[i]
duration = end_date - start_date
ax.broken_barh([(start_date, duration)], (i, 0.4), facecolors=("tab:blue"))
plt.yticks(range(len(task_names)), task_names)
# 显示图形
plt.show()
```
运行这段代码,您将看到一个简单的甘特图,显示了4个任务在时间轴上的开始和结束时间。
如果您想要更多的自定义和控制,可以参考Matplotlib的官方文档,或者查找其他的Python包和库,以满足您的特定需求。
用python写出生成车间调度问题甘特图的代码
下面是用Python生成车间调度问题甘特图的代码:
```python
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import datetime
# 创建数据
orders = pd.DataFrame({'order_id': [1, 2, 3, 4, 5], 'start': ['2022-12-01 00:00:00', '2022-12-01 00:00:00', '2022-12-01 00:00:00', '2022-12-02 00:00:00', '2022-12-02 00:00:00'], 'end': ['2022-12-02 00:00:00', '2022-12-02 00:00:00', '2022-12-02 00:00:00', '2022-12-03 00:00:00', '2022-12-03 00:00:00'], 'process_time': [24, 36, 48, 24, 48]})
# 转换时间格式
orders['start'] = pd.to_datetime(orders['start'], format='%Y-%m-%d %H:%M:%S')
orders['end'] = pd.to_datetime(orders['end'], format='%Y-%m-%d %H:%M:%S')
# 计算任务的开始和结束时间
tasks = []
for index, row in orders.iterrows():
task_start = row['start']
task_end = row['start'] + datetime.timedelta(hours=row['process_time'])
tasks.append((row['order_id'], task_start, task_end))
orders.loc[index, 'start'] = task_start
orders.loc[index, 'end'] = task_end
# 将任务转换为DataFrame
tasks_df = pd.DataFrame(tasks, columns=['order_id', 'start', 'end'])
tasks_df = tasks_df.sort_values(by='start')
# 计算目标日期范围
start_date = tasks_df['start'].min()
end_date = tasks_df['end'].max()
# 创建日期范围
dates = pd.date_range(start=start_date, end=end_date, freq='H')
# 创建甘特图数据
gantt_data = {}
for order_id, df in tasks_df.groupby('order_id'):
gantt_data[order_id] = np.zeros(len(dates))
for index, row in df.iterrows():
start_index = dates.get_loc(row['start'])
end_index = dates.get_loc(row['end'])
gantt_data[order_id][start_index:end_index] = 1
# 创建甘特图
fig, ax = plt.subplots(figsize=(10, 5))
for order_id, data in gantt_data.items():
y = [order_id + 0.5, order_id + 0.5]
x = [dates[0], dates[-1] + pd.Timedelta(hours=1)]
ax.plot(x, y, color='black')
ax.fill_between(dates, y[0], y[1], where=data == 1, color='green')
# 设置横轴和纵轴
ax.set_yticks(range(1, len(orders) + 1))
ax.set_yticklabels(orders['order_id'].values)
ax.set_xlabel('时间')
ax.set_ylabel('订单编号')
plt.show()
```
在上面的代码中,我们首先创建了一个数据框,其中包含每个订单的开始时间、结束时间和加工时间。我们将开始时间和结束时间的格式转换为datetime,以便我们可以更容易地进行计算。
接下来,我们计算每个任务的实际开始时间和结束时间,并将其存储在一个名为tasks的列表中。我们还在orders数据帧中更新了开始和结束时间的值。
然后,我们将任务转换为名为tasks_df的数据框,该数据框包含每个任务的订单号、开始时间和结束时间。我们按开始时间对任务数据框进行了排序,并计算了目标日期范围。
我们使用pandas.date_range函数创建了一个日期时间范围以表示甘特图中的时间轴。然后,我们循环每个任务,创建名为gantt_data的字典来存储甘特图数据,其中键是订单编号,值为一个长度为时间轴长度的numpy数组,该数组表示任务在该小时是否正在进行。最后,我们创建了一个甘特图,该图表使用matplotlib填充了灰色矩形来表示任务持续时间,并使用黑色线段表示订单之间的分界线。
运行此程序后,将生成一张甘特图,用于可视化车间调度问题。
阅读全文