在bokeh中创建绘图对象后交换轴

时间:2019-06-11 03:48:43

标签: python plot bokeh axes

在使用Bokeh创建绘图对象之后,我需要交换绘图的x和y轴。我尝试执行以下操作,但是出现以下javascript错误:

  

Javascript错误:无法读取未定义的属性'length'

我认为,由于背景虚假issue和相关的PRgist,这是可能的。

我想知道我在这里缺少(或不理解)什么才能使它起作用。

import bokeh.plotting
import bokeh.io

def swap_axes(plot):
    old_x_axis, old_y_axis = plot.below[0], plot.left[0]
    old_x_range, old_y_range = plot.x_range, plot.y_range
    old_x_scale, old_y_scale = plot.x_scale, plot.y_scale

    plot.below = []
    plot.left = []
    plot.add_layout(old_y_axis, 'below')
    plot.add_layout(old_x_axis, 'left')

    plot.x_range, plot.y_range = old_y_range, old_x_range
    plot.x_scale, plot.y_scale = old_y_scale, old_x_scale
    plot.center = plot.center[::-1]

    return plot


fruits = ['Apples', 'Pears', 'Nectarines', 'Plums', 'Grapes', 'Strawberries']
counts = [5, 3, 4, 2, 4, 6]

p = bokeh.plotting.figure(x_range=fruits, plot_height=250, title="Fruit Counts",
                          toolbar_location=None, tools="")
p.vbar(x=fruits, top=counts, width=0.9)

bokeh.io.show(p)
bokeh.io.show(swap_axes(p))

Working vs error output

1 个答案:

答案 0 :(得分:2)

目前还不清楚为什么您需要 在Bokeh服务器应用程序外部以这种方式更新绘图,从而在Python / JS运行时中使活动对象保持同步。在独立的HTML输出中,实际上没有一种重要的方法可以区分用于两个独立文件的一个图与用于生成两个独立文件的两个图。

不管怎样,对于Bokeh来说,这种特殊的重新安排会特别麻烦,因为有很多东西需要正确地洗牌。除了上面提供的功能外,轴的行情指示器还会驱动网格,因此需要修复这些网格。这行代码:plot.center = plot.center[::-1]毫无用处(它不会改变网格的配置方式,只会改变网格的绘制顺序)。可能还有其他一些东西也需要交换。

这是一项不平凡的任务,并且在大约6年内基本上没有人要求这样做,因此我们没有投入任何非常有限的项目资源来简化它。作为首席核心开发人员之一,我的建议是,您应该使一个函数能够根据flag参数返回两个版本的绘图,并显示两个单独的绘图:

show(make_plot(swapped=False))
show(make_plot(swapped=True))

也:

  

,但出现JavaScript错误。

为了将来提供参考,如果有错误消息,则应该始终始终将其包含在问题中。