In [1]:
import pandas as pd
from datetime import datetime

from bokeh.models import (
    Plot, Line, LinearAxis, DatetimeAxis, 
    SingleIntervalTicker, DatetimeTickFormatter,
    ColumnDataSource, Range1d,
    Text, Circle, Legend, Callback
)
from bokeh.models.widgets import TextInput, PreText, Paragraph
from bokeh.palettes import Spectral6
from bokeh.io import show, output_notebook, vplot, hplot

output_notebook()


BokehJS successfully loaded.

In [2]:
followers = pd.read_csv('followers-fake.csv', index_col='date', parse_dates=True)
party_list = list(followers.columns)
party_list


Out[2]:
['PSOE', 'PP', 'UpyD', 'Ciudadanos', 'Podemos', 'IU']

In [3]:
source = ColumnDataSource(followers)
xdr = Range1d(datetime(2015,1,1), datetime(2015,7,1))
ydr = Range1d(0, 1000)
PLOT_FORMATS = dict(
    x_range=xdr,
    y_range=ydr,
    title="",
    plot_width=800,
    plot_height=400,
    outline_line_color=None,
    toolbar_location=None,    
)
AXIS_FORMATS = dict(
    minor_tick_in=None,
    minor_tick_out=None,
    major_tick_in=None,
    major_label_text_font_size="10pt",
    major_label_text_font_style="normal",
    axis_label_text_font_size="10pt",

    axis_line_color='#AAAAAA',
    major_tick_line_color='#AAAAAA',
    major_label_text_color='#666666',

    major_tick_line_cap="round",
    axis_line_cap="round",
    axis_line_width=1,
    major_tick_line_width=1,
)

xaxis = DatetimeAxis(formatter=DatetimeTickFormatter(formats=dict(months=["%B %Y"])), **AXIS_FORMATS)
yaxis = LinearAxis(SingleIntervalTicker(interval=200), axis_label="# of followers", **AXIS_FORMATS)   

code="dateRange.set('%s', new Date(%s.get('value')).valueOf());"

start_callback = Callback(args={}, code=code % ('start', 'start'))
end_callback = Callback(args={}, code=code % ('end', 'end'))

start = TextInput(callback=start_callback)
end = TextInput(callback=end_callback)
start_callback.args['start'] = start
end_callback.args['end'] = end
start_callback.args['dateRange'] = xdr
end_callback.args['dateRange'] = xdr

In [4]:
plot = Plot(**PLOT_FORMATS)


legends = []
for i, party in enumerate(party_list):
    line = Line(x='date', y=party, line_color=Spectral6[i])
    lg = plot.add_glyph(source, line)
    legends.append((party, [lg]))
legend = Legend(legends=legends, orientation='top_left', border_line_color='white')


plot.add_layout(xaxis, 'below')
plot.add_layout(yaxis, 'left')
plot.add_layout(legend)


show(vplot(hplot(Paragraph(text='Start'), start, Paragraph(text='End'), end), plot))