更新curdoc()后从Bokeh图中删除Label布局

时间:2018-02-21 18:06:58

标签: python bokeh

我有一个多面板散景图,用Bokeh服务器渲染(Bokeh 0.12.14)。我正在运行一个带有按钮小部件(on_click())的函数,它修改了我的gridplot布局,添加了一些标签,并导出了一个自定义的.png图像。在函数中,我使用curdoc().hold()后跟curdoc().clear,对图进行修改并构建新的gridplot。然后,我将curdoc().add_root(gridplot)与修改后的gridplot布局一起使用,并运行export_png(curdoc())

导出后,我再次运行curdoc().clear(),重建原始gridplot版面,并使用curdoc().add_root(gridplot)恢复原始文档。最后以curdoc().unhold()结尾。

一切正常,但我无法弄清楚如何删除为.png导出创建的自定义标签。我正在添加几个标签,例如:

  season_label = Label(x=start_display, y=35, x_units='data', y_units='data',
             text= '%s - %s' % (starting_year, starting_year+1),
             render_mode='css', text_font_style='bold',
             text_font_size='14px', text_baseline='middle', text_align='left')

  newsnow_extra_fig.add_layout(season_label)

有没有办法从图中删除布局?

1 个答案:

答案 0 :(得分:1)

作为解决方法,我发现我可以将文字注释添加为Div widgets,而不是Labels。然后,我使用gridplot()在预期数字的上方或下方添加小部件。例如:

div_1 = bkm.widgets.Div(text="""My text annotation {} - {}""".format(starting_year, starting_year+1),
    width=1400, height=27, style={'background-color':'white'})

div_wb_1 = widgetbox(div_1)

grid = gridplot(div_wb_1,
                fig_1,
                fig_2,
                div_wb_2,
                ncols=1)

在.png导出之后,我可以通过重新定义grid而不使用div小部件框来重建我的原始文档:

grid = gridplot(fig_1,
                fig_2,
                ncols=1)

但是,当我将gridplot()(包括div)添加到curdoc()然后export_png(curdoc())时,div小部件和数字之间的背景是透明的(即使是定义{{ 1}}在html中) - 我需要在整个.png中使用白色背景。要解决此问题,我打开图像,使用PIL(Python Imaging Library)将背景编辑为白色,然后重新保存图像。这使得整个服务器端进程比我想要访问“导出图像”小部件按钮的客户端要慢得多。

我发布这个作为我自己的问题的答案,因为它解决了问题,但如果可能的话,从图中删除Label布局会很棒!

作为参考,here是我的网络应用程序,使用此答案获取“导出图像”按钮的功能。