Используя пример данных периодической таблицы 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