Python Bokeh JSCallback,基于Select过滤折线图

我在 Python Bokeh 的 JSCallback 函数中编写代码时遇到了一些麻烦。

具体来说,我正在尝试创建一个折线图,该图将仅显示下拉框中规定的数据。我必须使用 JSCallback 函数,因为服务器应用程序选项在工作中被禁用。

例如,如果我有一个用于不同系列(A、B、C、D)的数据集。我想这样做,以便在选择框中选择“A”将仅在折线图中显示该系列,“B”以显示 B 等。这相当于我过滤数据集(例如,使用 loc Pandas 中的函数),然后再绘制数据。我已尽力从文档中进行推断,但无济于事。这是一个示例脚本。我知道“var z == f”不正确,但我不知道如何在 JS 回调代码中过滤数据表。先感谢您。

import pandas as pd
from bokeh.io import show
from bokeh.layouts import column, widgetbox
from bokeh.models import ColumnDataSource, CustomJS, Select
from bokeh.models.widgets import Dropdown
from bokeh.plotting import figure


df = pd.DataFrame(data = {"A": [1,2,3,4,5],
                          "B": [6,7,8,9,10],
                          "C": [11,12,13,14,15],
                          "D": [16,17,18,19,20],
                          "day":[100,101,102,103,104]})

df = df.melt(id_vars = ["day"], var_name = "var",  value_name = "val")
source = ColumnDataSource(dict (val = df["val"],
                                day = df["day"]))


dropdown = Select(title ="Variable", value = "A", options = ["A","B","C","D"])



p = figure(plot_height = 300, plot_width = 800)                 
p.line("day", "val", source= source)


callback = CustomJS(args = dict(source=  source), code = """

data = source.data;
var f = cb.obj_value
var z = data["variable"]
var z == f

source.change.emit()


""")


dropdown.js_on_change("value", callback)

combined= column(p, widgetbox(dropdown))

show(combined)
尤金·帕霍莫夫

如果要转换或过滤某些内容,请不要更改数据源。散景中有视图、过滤器和变换。

但是由于您使用的是线条字形,因此使用过滤器会发出警告,因为线条是连接的字形。您可以做的是避免熔化数据框而只需切换列:

import pandas as pd
from bokeh.layouts import column
from bokeh.models import ColumnDataSource, CustomJS, Select
from bokeh.plotting import figure, show

df = pd.DataFrame(data={"A": [1, 2, 3, 4, 5],
                        "B": [6, 7, 8, 9, 10],
                        "C": [11, 12, 13, 14, 15],
                        "D": [16, 17, 18, 19, 20],
                        "day": [100, 101, 102, 103, 104]})

source = ColumnDataSource({c: v.values for c, v in df.items()})

initial_value = "A"
dropdown = Select(title="Variable", value=initial_value, options=["A", "B", "C", "D"])

p = figure(plot_height=300, plot_width=800)
l = p.line("day", initial_value, source=source)

dropdown.js_on_change("value", CustomJS(args=dict(line=l),
                                        code="line.glyph.y = {field: cb_obj.value};"))

show(column(p, dropdown))

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章