用Bokeh和pandas绘制多条线

bs1*_*123 20 python pandas bokeh

我想给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)
Run Code Online (Sandbox Code Playgroud)

但是,我收到错误:

RuntimeError: Missing required glyph parameters: ys
Run Code Online (Sandbox Code Playgroud)

相反,我设法做到了这一点:

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)
Run Code Online (Sandbox Code Playgroud)

那(无聊)完成了这项工作,但它对所有3行使用相同的颜色,见下文:

在此输入图像描述

问题:

1)如何将pandas数据帧传递给bokeh的multi_line?

2)如果不能直接使用,我如何操作数据帧数据,以便multi_line将创建具有不同颜色的每一行?

提前致谢.

小智 31

您需要为multi_line提供颜色列表.在你的例子中,你会这样做,如下所示:

p.multi_line(ts_list_of_list, vals_list_of_list, line_color=['red', 'green', 'blue'])
Run Code Online (Sandbox Code Playgroud)

这是对你的第二个例子的一个更通用的修改,它或多或少地完成了你的结果,但是更简洁,也许更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)
Run Code Online (Sandbox Code Playgroud)

产量:

multi_line情节

  • 请注意,使用multi_line绘制数据框列的严重缺点是,不容易为每个列添加图例条目.见[本问答](http://stackoverflow.com/questions/31419388/bokeh-how-to-add-legend-to-figure-created-by-multi-line-method) (2认同)