动态改变散景图的形状

时间:2016-10-11 07:17:13

标签: python-2.7 bokeh

我正在构建一个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都会出现上述行为。

2 个答案:

答案 0 :(得分:1)

有一种方法可以使用内置功能动态调整散景图。例如,

fig = plotting.figure(width=1200, height=900, title="Dynamic plot".format(chartType), sizing_mode='scale_width')

关键选项为sizing_mode='scale_width'

widthheight命令用作初始值。 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)来执行此操作,但我没有这样做以强调这是客户端解决方案。