import numpy as np
import pandas as pd
import datetime
from bokeh.io import output_notebook, show
from bokeh.plotting import figure
from bokeh.models import ColumnDataSource, LinearColorMapper, DatetimeTickFormatter
from bokeh.palettes import Blues9, Greens9, Reds9
output_notebook()
start_dt = datetime.datetime(2016,1,1)
params = ['p1', 'p2', 'p3']
dfs = []
for p in params:
dates = [start_dt + datetime.timedelta(minutes=int(x)) for x in np.random.randint(1,400,300).cumsum()]
dfs.append(pd.DataFrame({p: np.random.randn(len(dates))}, index=dates))
df = pd.concat(dfs, axis=1)
dfday = df.groupby(lambda x: x.date()).count()
dfday['start'] = dfday.index
dfday['end'] = [x+datetime.timedelta(days=1) for x in dfday.index]
dfday.head()
p1 | p2 | p3 | start | end | |
---|---|---|---|---|---|
2016-01-01 | 7 | 7 | 7 | 2016-01-01 | 2016-01-02 |
2016-01-02 | 5 | 6 | 4 | 2016-01-02 | 2016-01-03 |
2016-01-03 | 6 | 8 | 6 | 2016-01-03 | 2016-01-04 |
2016-01-04 | 6 | 5 | 8 | 2016-01-04 | 2016-01-05 |
2016-01-05 | 7 | 11 | 7 | 2016-01-05 | 2016-01-06 |
cmaps = {}
cmaps['p1'] = LinearColorMapper(palette=Reds9)
cmaps['p2'] = LinearColorMapper(palette=Blues9)
cmaps['p3'] = LinearColorMapper(palette=Greens9)
p = figure(x_axis_type="datetime", x_range=(dfday.index[0], dfday.index[-1]), y_range=[0,4],
tools='xpan, xwheel_zoom, reset, save, resize', width=800, height=300)
for i, par in enumerate(params):
p.quad(left='start', right='end', bottom=.6+i, top=1.4+i,
color={'field': par, 'transform': cmaps[par]}, source=ColumnDataSource(dfday))
p.xaxis.formatter = DatetimeTickFormatter(days=['%d-%b-%Y'])
show(p)