2015-07-20 7 views
12

Vorrei dare un dataframe panda a Bokeh per tracciare un grafico a linee con più linee. L'asse x deve essere il df.index e ogni df.columns deve essere una riga separata.Tracciare più linee con Bokeh e panda

questo è quello che wouuld piace fare:

import pandas as pd 
import numpy as np 
from bokeh.plotting import figure, show 

toy_df = pd.DataFrame(data=np.random.rand(5,3), columns = ('a', 'b' ,'c'), index = pd.DatetimeIndex(start='01-01-2015',periods=5, freq='d')) 

p = figure(width=1200, height=900, x_axis_type="datetime") 
p.multi_line(df) 
show(p) 

Tuttavia, ottengo l'errore:

RuntimeError: Missing required glyph parameters: ys 

Invece, ive riuscito a fare questo:

import pandas as pd 
import numpy as np 
from bokeh.plotting import figure, show 

toy_df = pd.DataFrame(data=np.random.rand(5,3), columns = ('a', 'b' ,'c'), index = pd.DatetimeIndex(start='01-01-2015',periods=5, freq='d')) 

ts_list_of_list = [] 
for i in range(0,len(toy_df.columns)): 
    ts_list_of_list.append(toy_df.index) 

vals_list_of_list = toy_df.values.T.tolist() 

p = figure(width=1200, height=900, x_axis_type="datetime") 
p.multi_line(ts_list_of_list, vals_list_of_list) 
show(p) 

Quello (inelegante) fa il lavoro ma usa lo stesso colore per tutte e 3 le linee, vedi sotto: enter image description here

Domande:

1) come posso passare un dataframe panda di Bokeh di multi_line?

2) Se non è possibile direttamente, come posso manipolare i dati del dataframe in modo che multi_line crei ogni riga con un colore diverso?

grazie in anticipo

risposta

19

è necessario fornire un elenco di colori a multi_line. Nel tuo esempio, si dovrebbe fare, qualcosa di simile:

p.multi_line(ts_list_of_list, vals_list_of_list, line_color=['red', 'green', 'blue']) 

Ecco una modifica finalità più generale del secondo esempio che fa più o meno quello che si è conclusa con, ma è un po 'più conciso e forse più Pythonic :

import pandas as pd 
import numpy as np 
from bokeh.palettes import Spectral11 
from bokeh.plotting import figure, show, output_file 
output_file('temp.html') 

toy_df = pd.DataFrame(data=np.random.rand(5,3), columns = ('a', 'b' ,'c'), index = pd.DatetimeIndex(start='01-01-2015',periods=5, freq='d')) 

numlines=len(toy_df.columns) 
mypalette=Spectral11[0:numlines] 

p = figure(width=500, height=300, x_axis_type="datetime") 
p.multi_line(xs=[toy_df.index.values]*numlines, 
       ys=[toy_df[name].values for name in toy_df], 
       line_color=mypalette, 
       line_width=5) 
show(p) 

che produce:

multi_line plot

+2

Si noti che un grave inconveniente di utilizzare multi_line per tracciare le colonne di un dataframe è che non è facilmente possibile aggiungere una voce di legenda per ciascuna delle colonne. Vedi [questo Q & A] (http://stackoverflow.com/questions/31419388/bokeh-how-to-add-legend-to-figure-created-by-multi-line-method) – jhin

+0

E 'possibile aggiungere un hover strumento per una tale figura? –

+0

@NicoleGoebel: può essere utile: http://stackoverflow.com/questions/31496628/in-bokeh-how-do-i-add-tooltips-to-a-timeseries-chart-hover-tool – bs123

1

È necessario tracciare un grafico Time Series. Questo ti permetterà di inserire facilmente una legenda. L'attributo TimeSeries può trovarsi in bokeh._legacy_charts. Vedere il seguente esempio si trova qui:

http://bokeh.pydata.org/en/0.9.3/docs/user_guide/charts.html

+0

nice to vedi che entrambi i grafici sono disponibili in bokeh e la sua documentazione ha continuato a svilupparsi! Ho intenzione di dare un altro sguardo a breve. – bs123