通过将DataFrame更改为ColumnDataSource数据来使用Bokeh滑块小部件

时间:2018-09-25 02:12:26

标签: python bokeh

使用来自Bokeh的Elements元素周期表样本数据,我试图创建一个滑块小部件以按大小过滤字形(使用“范德华半径”列)。对于气体,液体和固体,我有不同的字形集,每种字形对应不同的颜色。

我无法理解如何将滑块与DataFrame数据一起使用,因为必须将其放入ColumnDataSource中。更复杂的是,有3套字形(气体,液体和固体),因此我不确定这是否需要每个字形,或者是否有组合的方式(理想)。 / p>

当我在下面运行当前代码时,出现以下错误:

  

错误处理消息消息'PATCH-DOC'(修订1):ValueError('操作数不能与形状(160,)(40,)',)一起广播

45  46  2018-09-24 21:14:47
46  1   2018-09-24 21:08:47
46  25  2018-09-23 22:25:09

*您可以导入示例数据以查看其外观:

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)

0 个答案:

没有答案