我是否可以一次性绘制散景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()
但是我希望在这个数字上有一些互动性。特别是,将鼠标悬停在这些行上应显示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时再次感到笨拙。另外,我不知道如何为每行单独创建工具提示:我想不应将多行用于应该单独考虑的行。
有没有更直接,更简单的方法?
答案 0 :(得分:1)
我以前的评论根本不像我想输入的那样。 我试图建议:
p.add_tools(HoverTool( tooltips=[ ("X" ,"@x"), ("Y", "@y") ]))
您的ColumnDataSource
构造对我来说已经相当简洁了。
至于您在评论中的问题,将添加
p.add_tools(HoverTool( tooltips=[ ("X" ,"$x"), ("Y", "$y"), ("Name" , "@legend")]))
把戏吗?