Построение нескольких строк с помощью 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
Вместо этого ive удалось сделать это:
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)
Это (неуместно) выполняет эту работу, но использует один и тот же цвет для всех трех строк, см. ниже:
![enter image description here]()
Вопросы:
1) как я могу передать pandas dataframe для bokeh multi_line?
2) Если это невозможно напрямую, как я могу манипулировать данными dataframe, чтобы multi_line создавала каждую строку с другим цветом?
заблаговременно
Ответы
Ответ 1
Вам нужно предоставить список цветов для multi_line. В вашем примере вы бы сделали что-то вроде этого:
p.multi_line(ts_list_of_list, vals_list_of_list, line_color=['red', 'green', 'blue'])
Здесь более общая модификация вашего второго примера, которая делает больше или меньше того, что вы закончили, но немного более кратким и, возможно, более 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]()
Ответ 2
Вам нужно построить график временных рядов. Это позволит вам легко вставить легенду. Атрибут TimeSeries может быть расположен под именем bokeh._legacy_charts. См. Следующий пример:
http://bokeh.pydata.org/en/0.9.3/docs/user_guide/charts.html