有没有什么方法可以在 Python 中创建类似于这篇文章的时间线,只使用 1 个 vizualiation 包而没有其他设置?我曾尝试使用该plotnine
包在 Python 中使用 ggplot2 ,但这让它工作起来非常麻烦。此外,我已经尝试过该labella
软件包,但这需要安装 Latex 发行版。由于matplotlib
我找不到在事件栏旁边包含评论的方法。
问问题
2258 次
1 回答
1
我也有这个问题......这是我的解决方案。请忽略丑陋的颜色生成……这更多的是一项正在进行的工作。
它是 Python 3.6 测试的......
import numpy as np
import matplotlib.pylab as plt
import pandas as pd
from cycler import cycler
from datetime import datetime, timedelta
idx = pd.date_range('2018-1-1', '2018-9-10', freq='1D')
df = pd.DataFrame({'Offset': 20,'val': 2}, index=idx)
df['Offset']=[n for n in range(0,len(df))]
sched=[{'name':'tim',
'jobs':{
1:(datetime(2018,1,1,),datetime(2018,2,1)),
2:(datetime(2018,4,1) ,datetime(2018,5,1)),
3:(datetime(2018,6,1) ,datetime(2018,7,1))}
},
{'name':'BiMonthly',
'jobs':{
1:(datetime(2018,2,1,),datetime(2018,3,1)),
2:(datetime(2018,5,1) ,datetime(2018,6,1)),
3:(datetime(2018,7,1) ,datetime(2018,8,1))}
}
,
{'name':'Monthly',
'jobs':{
1:(datetime(2018,2,1),datetime(2018,2,10)),
2:(datetime(2018,3,1),datetime(2018,3,10)),
3:(datetime(2018,4,1),datetime(2018,4,10)),
4:(datetime(2018,5,1),datetime(2018,5,10)),
5:(datetime(2018,6,1),datetime(2018,6,10))
}},
{'name':'LongTerm',
'jobs':{
1:(datetime(2018,2,1),datetime(2018,5,1))
}
}]
color_cycle = cycler(c=['r', 'g', 'b'])
ls_cycle = cycler('ls', ['-', '--'])
sty_cycle = ls_cycle * ( color_cycle)
def get_offset(when):
global df
if type(when)==str:
when=pd.to_datetime(when)
try:
return df.loc[when]['Offset']
except KeyError:
print("{} Not Found".format(when))
return -1
thickness=0.3
timelines=[]
start_period = idx[0].to_period('D').ordinal
for a_job_group in sched:
timeline=[]
print("-----")
for keys in a_job_group['jobs']:
#print("Dates {} {}".format(a_job_group['jobs'][keys][0],
# a_job_group['jobs'][keys][1]))
offset_start = get_offset(a_job_group['jobs'][keys][0])
offset_end = get_offset(a_job_group['jobs'][keys][1])
print("offset {} {} TimeSpan {}".format(offset_start,
offset_end, offset_end - offset_start))
timeline_data=(start_period + offset_start,offset_end-offset_start)
timeline.append(timeline_data)
timelines.append(timeline)
pos= 0
df.drop(['Offset'],axis=1,inplace=True,)
ax = df.plot(color='w')
col_schema=[s for s in sty_cycle]
for t in timelines:
ax.broken_barh(t, [pos, thickness],
color=col_schema[pos]['c'],
linestyle=col_schema[pos]['ls'])
pos+= 1
plt.show()
它输出什么?
我必须添加一个索引 - 并检查我是否可以更改 TimeSteps(小时数周等),但到目前为止,这是我能找到的最佳解决方案。
我计划将mpld3添加到它 - 然后通过 Flask 运行它......所以我还有一些路要走。
于 2018-11-11T03:15:10.373 回答