web-dev-qa-db-fra.com

Tracer plusieurs lignes avec Bokeh et pandas

Je voudrais donner un pandas dataframe à Bokeh pour tracer un graphique linéaire avec plusieurs lignes.

L'axe des x doit être le df.index et chaque df.columns doit être une ligne distincte.

Voici ce que je voudrais faire:

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)

Cependant, j'obtiens l'erreur:

RuntimeError: Missing required glyph parameters: ys

Au lieu de cela, j'ai réussi à le faire:

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)

Cela (non scrupuleusement) fait le travail mais il utilise la même couleur pour les 3 lignes, voir ci-dessous:

enter image description here

Questions:

1) Comment puis-je passer un pandas dataframe au multi_line de bokeh?

2) Si ce n'est pas possible directement, comment puis-je manipuler les données du dataframe afin que multi_line crée chaque ligne avec une couleur différente?

Merci d'avance.

19
bs123

Vous devez fournir une liste de couleurs à multi_line. Dans votre exemple, vous feriez quelque chose comme ceci:

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

Voici une modification plus générale de votre deuxième exemple qui fait plus ou moins ce que vous avez obtenu, mais est un peu plus concise et peut-être plus 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)

ce qui donne:

multi_line plot

29
zpbruno

Vous devez tracer un graphique de séries chronologiques. Cela vous permettra d'insérer facilement une légende. L'attribut TimeSeries est situé sous bokeh._legacy_charts. Veuillez voir l'exemple suivant situé ici:

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

2
Hugo Alain Oliva