Выбор строк данных для точечной диаграммы в боке - PullRequest
0 голосов
/ 01 октября 2018

Каков наилучший способ выбора определенных строк в кадре данных с помощью раскрывающегося меню в Bokeh?Я попытался использовать модифицированный скрипт ниже, который отображает радужную оболочку, но получил только пустой экран сервера:

import pandas as pd

from bokeh.models import ColumnDataSource, ColorBar, CategoricalColorMapper
from bokeh.plotting import figure, show
from bokeh.palettes import Spectral6
from bokeh.io import curdoc
from bokeh.layouts import column
from bokeh.layouts import widgetbox

from bokeh.sampledata.iris import flowers as df
source = ColumnDataSource(df)

mapper = CategoricalColorMapper(
    factors=['setosa', 'virginica', 'versicolor'], 
    palette=['red', 'green', 'blue']) 

plot = figure(x_axis_label='petal_length', y_axis_label='sepal_length',plot_width=400,plot_height=400)
plot.circle('petal_length', 'sepal_length',size=4, source=source, 
            color={'field': 'species', 
                   'transform': mapper}) 

species=list (df['species'].unique())

menu = Select(options=species,value='setosa', title='Species')

# Add callback to widgets
def callback(attr, old,new):
    source_data=pd.DataFrame(source.data)
    new_data= source_data.loc[source_data['species']==menu.value]
    new_data_dict=dict (new_data)
    source.data=new_data_dict

menu.on_change('value', callback)

layout = column(menu, plot)
curdoc().add_root(layout)

Первая часть - это приведенный пример, поэтому диаграмма без меню работает нормально.Моя проблема связана с дизайном функции обратного вызова для выбора определенных строк в кадре данных.

Ответы [ 2 ]

0 голосов
/ 10 октября 2018
  1. Вы забыли импортировать Select.Добавить from bokeh.models.widgets import Select.
  2. Обратите внимание, как вы переопределяете источник данных в обратном вызове, поэтому после одного выбора все виды данных, кроме одного, будут удалены.Поэтому вам нужно будет изменить логику того, как вы переключаете данные.
0 голосов
/ 01 октября 2018

Похоже, вы забыли указать строку ввода для .loc, я предполагаю, что вы хотите, чтобы все строки, где столбец вида равен menu.value.Попробуйте это вместо вашего назначения new_data

new_data = source_data.loc[:,source_data['species']==menu.value]

В качестве альтернативы без .loc вы можете использовать логическое маскирование

new_data = source_data[source_data['species'] == menu.value]
...