Bokeh ColumnDataSource是否可以像Pandas DataFrame一样一次性绘制?

时间:2018-11-06 10:05:57

标签: bokeh

我是否可以一次性绘制散景ColumnDataSource,类似于绘制Pandas DataFrame(例如,the Pandas plotting documentation上的第二个数字);特别是如果ColumnDatasource是从DataFrame派生的?还是损失例如防止出现这种情况的索引?

所以,有了Pandas我可以做到:

import numpy as np
import pandas as pd
from matplotlib import pyplot as plt

years = np.arange(2000, 2020)
columns = ['first', 'second', 'third', 'fourth']
df = pd.DataFrame(data=np.random.random((20, 4)), columns=columns, index=years)
df.plot()
plt.show()   

enter image description here

但是我希望在这个数字上有一些互动性。特别是,将鼠标悬停在这些行上应显示y值和相应的标签名称。

我现在使用Bokeh:

from bokeh.io import output_notebook, show
from bokeh.plotting import figure
from bokeh.models import ColumnDataSource, HoverTool
from bokeh.palettes import Category20

output_notebook()
p = figure(plot_width=800, plot_height=600)

for column, color in zip(columns, Category20[4]):
    line = p.line(df.index, df[column], color=color, legend=column, name=column)
    p.add_tools(HoverTool(renderers=[line], tooltips=[(column, "$y")], toggleable=False))
p.legend.background_fill_alpha = 0.5
show(p)

单独的p.add_tools(...)调用使鼠标悬停在相应的行上时可以显示各个数据集标签和y值。

但是手动循环感觉有点笨拙。我想知道以下几行中是否有可用的内容:

source = ColumnDataSource(df)
p.multi_line(source=source, color=Category20[4])   
# or something similar to: p.multi_line(source=source, xs='index', ys=models)

其中索引自动用于x轴,列被循环,并且图例标签从列名称派生。

我发现的最佳选择似乎是

source = ColumnDataSource(dict(
    x=[df.index]*len(columns),
    y=[df[column].values for column in columns],
    color=Category20[4],
    legend=columns))
p.multi_line(source=source, xs='x', ys='y', color='color')
show(p)

,但是在创建ColumnDatasource时再次感到笨拙。另外,我不知道如何为每行单独创建工具提示:我想不应将多行用于应该单独考虑的行。

有没有更直接,更简单的方法?

1 个答案:

答案 0 :(得分:1)

我以前的评论根本不像我想输入的那样。 我试图建议:

p.add_tools(HoverTool( tooltips=[ ("X" ,"@x"), ("Y", "@y") ]))

您的ColumnDataSource构造对我来说已经相当简洁了。 至于您在评论中的问题,将添加

p.add_tools(HoverTool( tooltips=[ ("X" ,"$x"), ("Y", "$y"), ("Name" , "@legend")]))

把戏吗?