Python绘制甘特图
废话不说,上代码
complete_time = {(0, 0, 0, 1): (8, 9, 1), (1, 0, 0, 1): (5, 8, 3), (3, 0, 0, 0): (8, 10, 2), (0, 1, 0, 1): (1, 2, 1), (1, 1, 0, 1): (0, 1, 1), (3, 1, 0, 0): (1, 2, 1), (0, 2, 0, 1): (3, 5, 2), (1, 2, 0, 1): (2, 3, 1), (3, 2, 0, 0): (3, 5, 2), (2, 0, 1, 0): (10, 11, 1), (4, 0, 1, 0): (11, 13, 2), (5, 0, 1, 1): (10, 13, 3), (2, 1, 1, 0): (2, 4, 2), (4, 1, 1, 0): (4, 5, 1), (5, 1, 1, 1): (2, 4, 2), (2, 2, 1, 0): (5, 6, 1), (4, 2, 1, 0): (6, 9, 3), (5, 2, 1, 1): (5, 6, 1), (6, 0, 2, 1): (13, 14, 1), (7, 0, 2, 0): (13, 15, 2), (8, 0, 2, 1): (15, 16, 1), (6, 1, 2, 1): (5, 6, 1), (7, 1, 2, 0): (5, 7, 2), (8, 1, 2, 1): (7, 9, 2), (6, 2, 2, 1): (9, 11, 2), (7, 2, 2, 0): (9, 10, 1), (8, 2, 2, 1): (11, 13, 2)}
# complete_time的key表示的是任务、产品、工作站等信息,value第一个值表示的是任务开始时间,第二个值表示结束时间,第三个值表示加工时间
import matplotlib.pyplot as plt
def plt_gantt(complete_time):
plt.rcParams['font.sans-serif'] = ['SimHei'] # 显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 显示中文标签
fontdict_task = {
"family": "Microsoft YaHei",
"style": "oblique",
"weight": "bold",
"color": "white",
"size": 14
}
fontdict_time = {
"family": "Microsoft YaHei",
"style": "oblique",
"color": "white",
"size": 12
}
color = ['b', 'g', 'r']
for k, v in complete_time.items():
if k[3] == 0:
plt.barh(y=2 * k[2], width=v[2], left=v[0], edgecolor="black", color=color[k[1]])
plt.text(v[0] + 0.1, 2 * k[2] + 0.1, str(k[1] + 1) + " " + str(k[0]+1), fontdict=fontdict_task)
plt.text(v[0] + 0.2, 2 * k[2] - 0.2, str(v[0]) + " " + str(v[1]), fontdict=fontdict_time)
else:
plt.barh(y=2 * k[2] + 1, width=v[2], left=v[0], edgecolor="black", color=color[k[1]])
plt.text(v[0] + 0.1, 2 * k[2] + 1 + 0.1, str(k[1] + 1) + " " + str(k[0]+1), fontdict=fontdict_task)
plt.text(v[0] + 0.2, 2 * k[2] + 1 - 0.2, str(v[0]) + " " + str(v[1]), fontdict=fontdict_time)
ylabels = [] # 生成y轴标签
for i in range(3 * 2):
if i % 2 == 0:
ylabels.append("工作站 " + str(i // 2 + 1) + " 左边")
else:
ylabels.append("工作站 " + str(i // 2 + 1) + " 右边")
plt.yticks(range(3 * 2), ylabels, rotation=45)
plt.title("甘特图")
plt.xlabel("加工时间 /min")
plt.ylabel("工作站")
plt.show()
plt_gantt(complete_time)
1、barh函数绘制矩形块
利用matplotlib的柱形图绘制甘特图
核心函数就是plt.barh()
,横向绘制矩形块
plt.barh(y, width, left, edgecolor, color)
-
y 参数表示y轴坐标
-
width 表示矩形块的长度,也就是任务加工时间,任务持续时间等参数
-
left 表示矩形块最左边的 x轴坐标,
这样就能确定一个矩形块在图中的位置
-
edgecolor 表示矩形块的边的颜色,通常设置为 black
-
color 表示矩形块的颜色
2、矩形块标注字体
给矩形块添加标签
plt.text(x, y, label, font_style)
- x 表示x轴坐标
- y 表示y轴坐标
- label 表示要添加的标签内容
- font_style 标签字体的风格