我正在构建一个Web应用程序,它将图像显示为数据分析管道的一部分。为此,我需要在散景中动态更改Figure
对象的宽度和高度。
使用以下代码,Figure
的形状已更改,但更改仅在我调整浏览器窗口大小后生效,即使浏览器窗口调整大小太小。
import bokeh.plotting
import bokeh.models
import bokeh.layouts
# set up the interface
fig1 = bokeh.plotting.figure()
button = bokeh.models.Button(label='scramble')
# define a callback and connect it
def callback():
fig1.width = int(fig1.width * .8)
button.on_click(callback)
# add everything to the document
bokeh.plotting.curdoc().add_root(bokeh.layouts.column(button, fig1))
我需要运行一些更新方法吗?我已经读过“下一个回调回调”,但我不明白这是否相关。
在我的gnome系统上使用firefox和chrome都会出现上述行为。
答案 0 :(得分:1)
有一种方法可以使用内置功能动态调整散景图。例如,
fig = plotting.figure(width=1200, height=900, title="Dynamic plot".format(chartType), sizing_mode='scale_width')
关键选项为sizing_mode='scale_width'
width
和height
命令用作初始值。 sizing_mode
还有其他选项,所以我会调查一下。
答案 1 :(得分:1)
发生这种情况的原因是因为布局没有得到更新。虽然您的代码更改了图形的属性值,但您必须重新计算文档解算器中的所有值,才能实现实际的调整大小。
以下是BokehJS中发生调整大小挂钩的行:
https://github.com/bokeh/bokeh/blob/master/bokehjs/src/coffee/document.coffee#L92
在文档级别调用resize后,调整对象大小重新渲染:
https://github.com/bokeh/bokeh/blob/master/bokehjs/src/coffee/models/layouts/layout_dom.coffee#L61
问题在于,据我所知,目前还没有重新触发文档调整大小事件的暴露方式。
但是你可以在客户端做到这一点。这是使用CustomJS
的工作代码:
test.py
from bokeh.io import show
from bokeh.layouts import column
from bokeh.models import Button, CustomJS
from bokeh.plotting import figure
fig = figure()
button = Button(label='scramble')
button.callback = CustomJS(args=dict(fig=fig), code="""
var old_width = fig.width;
var doc = fig.document;
fig.width = old_width * 0.8;
doc.resize();
""")
col = column(button, fig)
show(col)
这可以使用python test.py
运行。
请注意,您也可以使用散景服务器将最后一行show(col)
替换为curdoc().add_root(col)
来执行此操作,但我没有这样做以强调这是客户端解决方案。