Может ли Bokeh ColumnDataSource быть построенным за один раз, как Pandas DataFrame? - PullRequest
0 голосов
/ 06 ноября 2018

Могу ли я нарисовать боке 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()   

enter image description here

Но я бы хотел немного интерактивности на этой фигуре; в частности, при наведении курсора на строки должно отображаться значение 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. Кроме того, я не знаю, как создавать всплывающие подсказки для каждой строки в отдельности: я предполагаю, что многострочные не должны использоваться для строк, которые должны рассматриваться индивидуально.

Есть ли более прямой, более простой способ?

1 Ответ

0 голосов
/ 06 ноября 2018

Мой предыдущий комментарий совсем не похож на то, что я пытался напечатать. Я пытался предложить:

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

Ваша ColumnDataSource конструкция кажется мне уже довольно сжатой. Что касается вашего вопроса в комментарии, добавлю

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

сделать трюк?

...