python - 如何使用 matplotlib 获取开始时间和结束时间最多毫秒的任务的甘特图
问题描述
我在每个任务的数据框中都有数据,包括开始时间、结束时间和状态。我想为此绘制一个甘特图。我尝试关注关于stackoverflow(链接)的其他问题,但他们使用了数值,因此无法使用它们。下面是代码。
import pandas as pd
import matplotlib.pyplot as plt
data = [['A', '2019-06-27 18:33:58.033', '2019-06-27 19:54:04.658', 'Success'], ['B', '2019-06-27 19:54:04.957', '2019-06-27 19:54:14.570', 'Success'], ['B', '2019-06-27 19:54:04.963', '2019-06-27 19:54:19.928', 'Failed']]
#Converting List to a dataframe
df = pd.DataFrame(data, columns = ['Task', 'Start Time', 'End Time', 'Status'])
#Calculating the Time Difference
df['Duration'] = pd.to_datetime(df['End Time']) - pd.to_datetime(df['Start Time'])
color = {"Success":"turquoise", "Failed":"crimson"}
fig,ax=plt.subplots(figsize=(6,3))
labels=[]
for i, task in enumerate(df.groupby("Task")):
labels.append(task[0])
for r in task[1].groupby("Status"):
data = r[1][["Start Time", "Duration"]]
ax.broken_barh(data.values, (i-0.4,0.8), color=color[r[0]] )
ax.set_yticks(range(len(labels)))
ax.set_yticklabels(labels)
ax.set_xlabel("time [ms]")
plt.tight_layout()
plt.show()
它没有显示正确的图表,可能是由于时间格式。如果我使用十进制数字代替时间,上面的代码效果很好。这里有任何帮助。
解决方案
我可以在 matplotlib 中使用时间绘制图表,但是无法为成功和失败使用不同的颜色条。欢迎使用此功能的解决方案。
import pandas as pd
from datetime import datetime
import matplotlib.dates as dates
import matplotlib.pyplot as plt
data = [['A', '2019-06-27 18:33:58.033', '2019-06-27 19:54:04.658', 'Success'], ['B', '2019-06-27 19:54:04.957', '2019-06-27 19:58:14.570', 'Success'], ['C', '2019-06-27 19:54:04.963', '2019-06-27 19:54:19.928', 'Failed']]
df = pd.DataFrame(data, columns = ['Task', 'Start_Time', 'End_Time', 'Status'])
df_phase = df
df_phase['Start_Time'] = pd.to_datetime(df_phase['Start_Time'], format='%Y-%m-%d %H:%M:%S.%f')
df_phase['End_Time'] = pd.to_datetime(df_phase['End_Time'], format='%Y-%m-%d %H:%M:%S.%f')
#Convert DF columns into lists
sdate = df_phase['Start_Time'].tolist()
edate = df_phase['End_Time'].tolist()
tasks = df_phase['Task'].tolist()
#Convert time to Matplotlib number format
edate, sdate = [dates.date2num(item) for item in (edate, sdate)]
time_diff = edate - sdate
ypos = range(len(tasks))
fig, ax = plt.subplots()
ax.barh(ypos, time_diff, left=sdate, height=0.8, align='center', color='blue',edgecolor='black')
plt.yticks(ypos, tasks)
ax.axis('tight')
# We need to tell matplotlib that these are dates...
ax.xaxis_date()
plt.show()
输出图像:
推荐阅读
- azure - 在文档中的 azure 文件中进行搜索
- java - Spring Boot 2.0.4 + Hibernate 5- 在控制器范围之外获取惰性集合而不调用 getter
- javascript - 从前端执行 php 代码以允许 https 网站上的 http iframe
- azure - Azure Logic App 提供 503 服务不可用
- android - 取消触摸时的吐司消息
- mysql - MySQL getConnection() 无缘无故崩溃
- c# - 使用 .NET 检查远程桌面服务 (RDS)/远程桌面会话主机 (RDSH) 是否安装在 Windows 服务器上
- javascript - 如何处理各种错误以防止应用程序崩溃?
- python - Django 应用程序从 JSON 动态生成表单?
- azure-active-directory - 如何在 .NET Core Web Api 中证明令牌声明以进行 Azure Active Directory 安全检查