Использование виджета слайдера Bokeh путем изменения DataFrame на данные ColumnDataSource - PullRequest
0 голосов
/ 25 сентября 2018

Используя пример данных периодической таблицы Elements из Bokeh, я пытаюсь создать виджет-слайдер для фильтрации глифов по размеру (используя столбец «van der waals radius»).У меня есть разные наборы глифов для газа, жидкости и твердого тела, с разными цветами, соответствующими каждому.

У меня проблемы с пониманием того, как использовать ползунок с данными DataFrame, так как я должен поместить его в ColumnDataSource.Чтобы сделать вещи более сложными, есть 3 набора символов (газ, жидкость и твердое тело), ​​поэтому я не уверен, что для этого требуется ползунок для каждого или есть способ объединить (было бы идеально).

Когда я запускаю текущий код ниже, я получаю следующую ошибку:

сообщение об ошибке обработки Сообщение «PATCH-DOC» (редакция 1): ValueError («операнды не могут быть переданы»вместе с формами (160,) (40,) ',)

from bokeh.plotting import figure
from bokeh.io import curdoc
from bokeh.sampledata.periodic_table import elements
from bokeh.models import ColumnDataSource, Range1d
from bokeh.models.annotations import Span, Label
from bokeh.layouts import layout
from bokeh.models.widgets import Slider

elements.dropna(inplace=True)

colormap={"gas":"yellow","liquid":"orange","solid":"red"}
elements["color"]=[colormap[x] for x in elements["standard state"]]
elements["size"]= elements["van der Waals radius"]/10

gas=ColumnDataSource(elements[elements["standard state"]=="gas"])
solid=ColumnDataSource(elements[elements["standard state"]=="solid"])
liquid=ColumnDataSource(elements[elements["standard state"]=="liquid"])

gas1=ColumnDataSource(elements[elements["standard state"]=="gas"])
solid1=ColumnDataSource(elements[elements["standard state"]=="solid"])
liquid1=ColumnDataSource(elements[elements["standard state"]=="liquid"])

f=figure()

f.xaxis.axis_label="Atomic Radius"
f.yaxis.axis_label="Boiling Point"

f.circle(x="atomic radius",y="boiling point", size='size',
         fill_alpha=0.2, color='color', legend="Gas", source=gas)
f.circle(x="atomic radius",y="boiling point", size='size',
         fill_alpha=0.2, color='color', legend="Liquid", source=liquid)
f.circle(x="atomic radius",y="boiling point", size='size',
         fill_alpha=0.2, color='color', legend="Solid", source=solid)

def filter_size(attr, old, new):
    N = slider.value
    new1 = ColumnDataSource(elements.loc[(elements[elements["standard state"]=="gas"]) & (elements["van der Waals radius"] >= N)])
    new2 = ColumnDataSource(elements.loc[(elements[elements["standard state"]=="solid"]) & (elements["van der Waals radius"] >= N)])
    new3 = ColumnDataSource(elements.loc[(elements[elements["standard state"]=="liquid"]) & (elements["van der Waals radius"] >= N)])
    gas1.data = new1.data
    solid1.data = new2.data
    liquid1.data = new3.data
    print(slider.value)

slider=Slider(start=min(elements["van der Waals radius"]-1),end=max(elements["van der Waals radius"])+1,value=10,step=1.0,title="Van der Waals Radius: ")
slider.on_change("value",filter_size)

lay_out=layout([slider])

curdoc().add_root(f)

curdoc().add_root(lay_out)

* Вы можете импортировать данные примера, чтобы посмотреть, как они выглядят:

from bokeh.sampledata.periodic_table import elements
...