python - 使用 CustomJS 通过 Bokeh 制作动态散点图 - 问题为 "nonexistent column name"

标签 python bokeh

我想我找到了一个可以利用的具体例子 here ,但不幸的是,同样的逻辑对我不起作用。

我有两个问题:

  • 这是我试图做的甚至可能的事情:在 html 文档中发送动态散点图,允许您控制 x 和 y 轴上绘制的内容。我已经成功地完成了静态图,但还没有破解动态图。

  • 我的代码哪里出了问题(见下文?)

以下是相关的代码片段(按顺序排列。我有一个数据框,已使用 ColumnDataSource 将其转换为“源”。

我创建了一个初始图(注意,此时,没有名为“x”和“y”的列。我稍后在回调函数中创建这些列):

plot.circle('x', 'y',
            source=source,
            color={'field': 'Picker',
                    'transform': mapper},
                    legend='Picker')

我创建了两个下拉菜单(请注意,每个下拉菜单中的选项对应于我希望人们能够从中进行选择的“源”列)

x_menu=Select(options=['Box Office', 'Difference', 'Price Paid'],
                        value='Box Office',
                         title='What do you want to put on the x axis')

y_menu=Select(options=['Metacritic', 'Rotten Tomatoes'],
                        value='Metacritic',
                         title='What do you want to put on the y axis')

我创建回调:

callback = CustomJS (args=dict(source=source), code="""
    console.log('changed selected option', cb_obj.value)
    var data=source.data
    data['x']=data[cb_obj.value]
    data['y']=data[cb_obj.value]
    source.change.emit();
    """)

我将回调分配给下拉菜单:

x_menu.callback = callback
y_menu.callback = callback

然后我尝试展示情节:

show(row(widgetbox(x_menu, y_menu), plot))

但它返回以下错误:

ERROR:bokeh.core.validation.check:E-1001 (BAD_COLUMN_NAME): Glyph refers to nonexistent column name: x, y [renderer: GlyphRenderer(id='df96b108-e2e4-4b8c-b0c6-12df40b4205d', ...)]

非常感谢任何帮助。谢谢!

最佳答案

如果您提供一个独立的最小示例(我们可以复制、粘贴和运行的代码),那么帮助会更容易。话虽如此,这里有一些内容可能会帮助您入门。您已经非常接近这个解决方案,但我想重要的部分是为每个菜单都有一个回调。

我希望这有帮助:-)

# -*- coding: utf-8 -*-
import numpy as np
import pandas as pd

from bokeh.layouts import row, widgetbox
from bokeh.models import CustomJS, Select
from bokeh.plotting import figure, show, ColumnDataSource

# Define some random data
dataframe = pd.DataFrame({
    'Difference': np.sin(np.linspace(0, 100, 500)),
    'Price': np.cos(np.linspace(0, 100, 500)),
    'Metacritic': np.sin(np.linspace(0, 100, 500)),
    'Rotten Tomatoes': np.cos(np.linspace(0, 200, 500)),
    })

# Set x and y-axis defaults
dataframe['x'] = dataframe['Difference']
dataframe['y'] = dataframe['Metacritic']

# Create Bokeh's ColumnDataSource
source = ColumnDataSource(data=dataframe)

# Create the plot figure
plot = figure(plot_width=400, plot_height=400)
plot.circle('x', 'y', source=source)

# Create the dropdown menus
x_menu = Select(options=['Difference', 'Price'],
                value='Difference',
                title='What do you want to put on the x axis')

y_menu = Select(options=['Metacritic', 'Rotten Tomatoes'],
                value='Metacritic',
                title='What do you want to put on the y axis')

# Create two callbacks, one for each menu
callback_x = CustomJS(args=dict(source=source), code="""
    console.log('changed selected option', cb_obj.value)
    var data=source.data
    data['x']=data[cb_obj.value]
    source.change.emit();
    """)

callback_y = CustomJS(args=dict(source=source), code="""
    console.log('changed selected option', cb_obj.value)
    var data=source.data
    data['y']=data[cb_obj.value]
    source.change.emit();
    """)

# Assign callbacks to menu widgets
x_menu.callback = callback_x
y_menu.callback = callback_y

# Show the html document with a layout
show(row(widgetbox(x_menu, y_menu), plot))

关于python - 使用 CustomJS 通过 Bokeh 制作动态散点图 - 问题为 "nonexistent column name",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53287715/

相关文章:

Python单元测试.mock : patched class method called but assertion fails

Python 实例和属性 : is this a bug or i got it totally wrong?

python - Pandas 中数据帧的自定义计算函数

javascript - Bokeh HTML 模板格式化程序不起作用

javascript - 使用带有 Pythonic 回调的 Bokeh Slider 滑动图像

Python **kwargs 循环中的修改

python - 查找列中的最大值并返回行号

python - 将 Bokeh 组件与 elementtree 结合使用

Python Bokeh 表列和标题不对齐

python - 如何在回调中引用 Bokeh 四边形值