使用Bokeh绘制时间序列图?

时间:2017-08-31 03:33:22

标签: python python-2.7 bokeh

我有这样的字典:

dic = {'2017-08-11': {'Yes': 157, 'Not sure': 2, 'No': 1}, '2017-08-22': {'Yes': 142, 'Not sure': 12}, '2017-08-01': {'Yes': 112, 'Others': 10, 'Not sure': 4, 'No': 9}, '2017-08-17': {'Yes': 117, 'No': 12, 'Not sure': 11, 'Others': 2}, '2017-08-25': {'Yes': 61, 'Not sure': 9}, '2017-08-23': {'Yes': 268, 'Not sure': 20, 'No': 1}, '2017-07-10': {'Yes': 123, 'Not sure': 4, 'No': 1}, '2017-08-10': {'Yes': 343, 'Not sure': 20}, '2017-07-13': {'Yes': 116, 'Others': 1, 'Not sure': 14, 'No': 2}, '2017-07-14': {'Yes': 255, 'Not sure': 22, 'No': 6}, '2017-08-07': {'Yes': 73, 'Others': 3, 'Not sure': 4, 'No': 5}, '2017-08-04': {'Not sure': 11, 'Others': 8, 'Yes': 178, 'No': 10}, '2017-08-16': {'Not sure': 10, 'Yes': 219}, '2017-07-18': {'Yes': 1, 'No': 1}, '2017-08-15': {'Yes': 301, 'Others': 4, 'Not sure': 37, 'No': 31}, '2017-08-08': {'Yes': 38, 'No': 2, 'Others': 1}, '2017-08-09': {'Yes': 120, 'Not sure': 3}, '2017-08-28': {'Yes': 206, 'Others': 2, 'Not sure': 18, 'No': 24}, '2017-08-14': {'Yes': 46, 'No': 3, 'Not sure': 5, 'Others': 7}}

然后我使用字典使用Bokeh生成时间序列图:

from bokeh.charts import TimeSeries
from bokeh.io import output_file, show
from bokeh.io import output_notebook
from dateutil.parser import parse
output_notebook()
list_x = []
list_y = []
for i in dic:
    list_x.append(i)
    list_y.append(round(float(dic[i]['Yes'])/float(sum(dic[i].values()))*100, 2))
df_date = pd.DataFrame(columns=['Date', 'Precision'])
df_date['Date'] = list_x
df_date['Precision'] = list_y
df_date.sort_values('Date', ascending=True, inplace=True)
x = df_date['Date'].tolist()
y = df_date['Precision'].tolist()
data = dict(Precision = y, Date = [parse(s) for s in x])
p = TimeSeries(data, ylabel='Precision(%)')
output_file("timeseries.html")
show(p)

result没有显示x轴上的日期,如果有人可以帮助我,我会很高兴,谢谢!

1 个答案:

答案 0 :(得分:12)

TimeSeries是已删除到单独的新bokeh.charts项目的旧bkcharts API的一部分。它目前没有维护,我强烈反对使用它。但是,您可以使用稳定的bokeh.plotting API轻松创建时间序列图。这是使用您的数据的最小示例(我已经更新以更好地使用Pandas,并且没有显式循环)

import pandas as pd

from bokeh.models import ColumnDataSource
from bokeh.plotting import figure, show, output_file

dic = {'2017-08-11': {'Yes': 157, 'Not sure': 2, 'No': 1}, '2017-08-22': {'Yes': 142, 'Not sure': 12}, '2017-08-01': {'Yes': 112, 'Others': 10, 'Not sure': 4, 'No': 9}, '2017-08-17': {'Yes': 117, 'No': 12, 'Not sure': 11, 'Others': 2}, '2017-08-25': {'Yes': 61, 'Not sure': 9}, '2017-08-23': {'Yes': 268, 'Not sure': 20, 'No': 1}, '2017-07-10': {'Yes': 123, 'Not sure': 4, 'No': 1}, '2017-08-10': {'Yes': 343, 'Not sure': 20}, '2017-07-13': {'Yes': 116, 'Others': 1, 'Not sure': 14, 'No': 2}, '2017-07-14': {'Yes': 255, 'Not sure': 22, 'No': 6}, '2017-08-07': {'Yes': 73, 'Others': 3, 'Not sure': 4, 'No': 5}, '2017-08-04': {'Not sure': 11, 'Others': 8, 'Yes': 178, 'No': 10}, '2017-08-16': {'Not sure': 10, 'Yes': 219}, '2017-07-18': {'Yes': 1, 'No': 1}, '2017-08-15': {'Yes': 301, 'Others': 4, 'Not sure': 37, 'No': 31}, '2017-08-08': {'Yes': 38, 'No': 2, 'Others': 1}, '2017-08-09': {'Yes': 120, 'Not sure': 3}, '2017-08-28': {'Yes': 206, 'Others': 2, 'Not sure': 18, 'No': 24}, '2017-08-14': {'Yes': 46, 'No': 3, 'Not sure': 5, 'Others': 7}}

df = pd.DataFrame.from_dict(dic, orient="index")
df = df.fillna(0)
df.index = pd.to_datetime(df.index)
df.index.name = 'Date'
df.sort_index(inplace=True)

df['Total'] = df.Yes + df['Not sure'] + df.No + df.Others
df['Precision'] = round(df.Yes/df.Total, 2)

source = ColumnDataSource(df)

p = figure(x_axis_type="datetime", plot_width=800, plot_height=350)
p.line('Date', 'Precision', source=source)

output_file("ts.html")
show(p)

哪个收益

enter image description here