2017-08-31 25 views
1

我有這樣一本字典:使用散景繪製時間序列圖?

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}} 

然後我用字典來生成使用散景一時間序列圖:

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

圖書館像散景通常支持多種不同的輸入格式。使用小型「模擬」示例嘗試一下。然後,嘗試以最少的步驟從原始數據中獲取數據(將數據轉換爲5次!)。另外,考慮使用Python3,Python2的死亡時鐘正在滴答滴答! –

+0

@感謝您的投入! –

回答

4

TimeSeries是已被移走到一個單獨的新bkcharts項目老bokeh.charts API的一部分。它目前沒有維護,我強烈勸阻它的使用。但是,您可以輕鬆創建穩定的bokeh.plotting API的時間序列圖。下面是使用你的數據(我也更新,以更好地利用大熊貓,並沒有顯式的循環)小例子

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