web-dev-qa-db-ja.com

Bokehとpandasを使用して複数の行をプロットする

pandasデータフレームをBokehに与えて、複数の線で折れ線グラフをプロットしたいと思います。

X軸はdf.indexであり、各df.columnsは個別の行である必要があります。

これは私がやりたいことです:

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)

ただし、次のエラーが表示されます。

RuntimeError: Missing required glyph parameters: ys

代わりに、私はこれをなんとかすることができました:

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)

それは(不当に)仕事をしますが、3行すべてに同じ色を使用します。以下を参照してください。

enter image description here

質問:

1)どうすればpandasデータフレームをボケのmulti_lineに渡すことができますか?

2)直接不可能な場合、multi_lineが各行を異なる色で作成するようにデータフレームデータを操作するにはどうすればよいですか?

前もって感謝します。

19
bs123

Multi_lineに色のリストを提供する必要があります。あなたの例では、次のようにします:

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

次に、2番目の例のより一般的な変更を示します。これは、最終的には多少なりとも動作しますが、もう少し簡潔で、おそらく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)

生成されるもの:

multi_line plot

29
zpbruno

時系列チャートをプロットする必要があります。これにより、凡例を簡単に挿入できます。 TimeSeries属性は、bokeh._legacy_chartsの下に配置できます。ここにある次の例を参照してください。

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

2