Python / Bokeh - Как я могу иметь интерактивный линейный график с возможностью выбора нескольких вариантов? - PullRequest
0 голосов
/ 24 октября 2019

Я пытаюсь создать интерактивный сюжет в блокноте Jupyter. Я хочу иметь возможность выбрать несколько вариантов одновременно, но пока я могу выбрать только один вариант за раз. Например, я могу фильтровать только по группе «А», «В» или «С». Может ли кто-нибудь помочь мне изменить это так, чтобы я мог выбрать группу «A» и «B» одновременно.

Я пытался использовать опцию MultiSelect из bokeh.models.widgets, но я невозможность интерактивного обновления графика с моим выбором.

import pandas as pd 
import numpy as np 
import bokeh
from bokeh.plotting import figure, show
from bokeh.io import output_notebook, push_notebook, output_file, save
from bokeh.models import ColumnDataSource, HoverTool 
from bokeh.models.widgets import DataTable, DateFormatter, TableColumn, MultiSelect
from ipywidgets import interact

np.random.seed(1)
x = np.random.randint(low = 1, high = 50, size = 25)
y = [10, 10, 10, 10, 10, 10, 5,5,5,5,5,5,20,20,20,20,20,20,20,25,25,25,25,25,25]
gr = ['A','B','C','D','E','A','B','C','D','E','A','B','C','D','E','A','B','C','D','E','A','B','C','D','E']

df = pd.DataFrame()
df['x'] = x
df['y'] = y
df['gr'] = gr
def update(grp):
    new_data = df.loc[df.gr == grp, :]
    ggp = new_data.groupby(['y']).size().to_frame()
    ggp.columns = ['cnt']
    source1 = ColumnDataSource(ggp)
    source.data = source1.data
    push_notebook()
gdf = df.groupby(['y']).size().to_frame()
gdf.columns = ['cnt']
hover = HoverTool(
    tooltips=[
        ( 'y',   '@y'            ),
        ( 'count',  '@{cnt}{0.2f}' )])
source = ColumnDataSource(gdf)
p1 = figure(plot_width=600, plot_height=300, title="counts",
            tools="pan,wheel_zoom,box_zoom,reset, save")

p1.vbar(x='y', top = 'cnt', width=0.5, source = source)
p1.add_tools(hover)
output_notebook()
from bokeh.layouts import column
show(p1, notebook_handle = True)
interact(update, grp = df.gr.unique())

enter image description here

...