我有这样的字典:
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轴上的日期,如果有人可以帮助我,我会很高兴,谢谢!
答案 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)
哪个收益