1

有没有什么方法可以在 Python 中创建类似于这篇文章的时间线,只使用 1 个 vizualiation 包而没有其他设置?我曾尝试使用该plotnine包在 Python 中使用 ggplot2 ,但这让它工作起来非常麻烦。此外,我已经尝试过该labella软件包,但这需要安装 Latex 发行版。由于matplotlib我找不到在事件栏旁边包含评论的方法。

4

1 回答 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 回答