如何直接从 javascript 获取和修改已经存在的散景图形元素?
How to get access and modify already existing Bokeh figure elements directly from javascript?
我正在使用 Bokeh 和 Flask 开发应用程序。
使用服务器端 python 代码,它会生成一个嵌入网页的绘图,其中包含各种旨在配置绘图的用户输入元素。
我知道从 Bokeh v0.12.x 开始,有一个 API 允许直接从 javascript.
创建和操作绘图
我在这里缺少的一点是,从 Bokeh
javascript 对象开始,我如何列出和访问已经实例化的图形对象(figure
, line
, ColumnDataSource
, ...)? 使用 BokehJS API, 然后我就可以编写 javascript 代码来翻译网页用户事件 (复选框、单击按钮、文本输入...)转化为绘图上的操作(更改线条颜色、隐藏线条、更新数据点值...)。
考虑这个非常基本的例子。我希望它能帮助你入门。
两个滑块更改中间点的 x
和 y
坐标。
from bokeh.plotting import figure
from bokeh.resources import CDN
from bokeh.embed import file_html
from bokeh.models import ColumnDataSource
from jinja2 import Template
source = ColumnDataSource(data=dict(x=[1, 2, 3],
y=[3, 2, 1]),
name='my-data-source')
p = figure()
l1 = p.line("x", "y", source=source)
# copied and modified default file.html template used for e.g. `file_html`
html_template = Template("""
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>{{ title|e if title else "Bokeh Plot" }}</title>
{{ bokeh_css }}
{{ bokeh_js }}
<style>
html {
width: 100%;
height: 100%;
}
body {
width: 90%;
height: 100%;
margin: auto;
}
</style>
<script>
function change_ds_value(name, idx, value) {
var ds = Bokeh.documents[0].get_model_by_name('my-data-source');
ds.data[name][idx] = value;
ds.change.emit();
}
</script>
</head>
<body>
<div>
{{ plot_div|indent(8) }}
{{ plot_script|indent(8) }}
<input type='range' min='-5' max='5'
onchange='change_ds_value("x", 1, this.value)'/>
<input type='range' min='-5' max='5'
onchange='change_ds_value("y", 1, this.value)'/>
</div>
</body>
</html>
""")
html = file_html(p, CDN, template=html_template)
with open('test.html', 'wt') as f:
f.write(html)
我正在使用 Bokeh 和 Flask 开发应用程序。 使用服务器端 python 代码,它会生成一个嵌入网页的绘图,其中包含各种旨在配置绘图的用户输入元素。
我知道从 Bokeh v0.12.x 开始,有一个 API 允许直接从 javascript.
创建和操作绘图我在这里缺少的一点是,从 Bokeh
javascript 对象开始,我如何列出和访问已经实例化的图形对象(figure
, line
, ColumnDataSource
, ...)? 使用 BokehJS API, 然后我就可以编写 javascript 代码来翻译网页用户事件 (复选框、单击按钮、文本输入...)转化为绘图上的操作(更改线条颜色、隐藏线条、更新数据点值...)。
考虑这个非常基本的例子。我希望它能帮助你入门。
两个滑块更改中间点的 x
和 y
坐标。
from bokeh.plotting import figure
from bokeh.resources import CDN
from bokeh.embed import file_html
from bokeh.models import ColumnDataSource
from jinja2 import Template
source = ColumnDataSource(data=dict(x=[1, 2, 3],
y=[3, 2, 1]),
name='my-data-source')
p = figure()
l1 = p.line("x", "y", source=source)
# copied and modified default file.html template used for e.g. `file_html`
html_template = Template("""
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>{{ title|e if title else "Bokeh Plot" }}</title>
{{ bokeh_css }}
{{ bokeh_js }}
<style>
html {
width: 100%;
height: 100%;
}
body {
width: 90%;
height: 100%;
margin: auto;
}
</style>
<script>
function change_ds_value(name, idx, value) {
var ds = Bokeh.documents[0].get_model_by_name('my-data-source');
ds.data[name][idx] = value;
ds.change.emit();
}
</script>
</head>
<body>
<div>
{{ plot_div|indent(8) }}
{{ plot_script|indent(8) }}
<input type='range' min='-5' max='5'
onchange='change_ds_value("x", 1, this.value)'/>
<input type='range' min='-5' max='5'
onchange='change_ds_value("y", 1, this.value)'/>
</div>
</body>
</html>
""")
html = file_html(p, CDN, template=html_template)
with open('test.html', 'wt') as f:
f.write(html)