Могу ли я нарисовать боке ColumnDataSource
за один раз, подобно графику Pandas DataFrame (например, вторая цифра на документации по графику Pandas ); особенно если ColumnDatasource является производным от DataFrame? Или потеря напр. индекс, предотвращающий это?
Итак, с Пандами я могу сделать:
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 и имя соответствующей метки.
С Боке я сейчас использую:
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. Кроме того, я не знаю, как создавать всплывающие подсказки для каждой строки в отдельности: я предполагаю, что многострочные не должны использоваться для строк, которые должны рассматриваться индивидуально.
Есть ли более прямой, более простой способ?