在全息视图中访问bokeh(图)参数

时间:2019-02-25 12:00:52

标签: python data-visualization bokeh holoviews

主要使用holoviews的抽取操作,我坚持使用holoviews,但是在调整holoviews中的bokeh输出时遇到了限制:

要实现纯散景中的“链接平移” ,需要共享例如bokehs bokeh.plotting.figure.Figure对象中的x_range参数,如

# create a new plot 
s1 = figure(plot_width=250, plot_height=250)

# create a new plot and share only one range 
s2 = figure(plot_width=250, plot_height=250, x_range=s1.x_range)

(有关完整示例,请访问https://bokeh.pydata.org/en/latest/docs/user_guide/interaction/linking.html#userguide-interaction-linking

我如何访问和操纵由holoviews创建的散景人物?

我想直接在全息视图中实现链接平移。 这样做的原因是,在具有不同范围的绘图中保留交互性

我知道,holoviews选项 axiswise = True 可以完美地自动调整不同的范围,但似乎不能仅针对单个轴(例如y轴)定义此范围,而同时保留链接的平移交互性x轴。

我该如何完成?非常感谢你!

1 个答案:

答案 0 :(得分:1)

这个问题有几种不同的答案。让我们从最直接的解决方法开始,即尝试链接一个轴而不是另一个轴。这可以通过给尺寸标注不同的名称来实现,例如只需为尺寸之一命名,而不使用默认的“ x”或“ y”即可:

hv.Curve([1, 2, 3], 'x', 'y') + hv.Curve([1, 2, 3], 'x', 'y2')

确切地说,在这种情况下,轴的“标识”由尺寸名称,标签和单位确定。这样可以轻松共享代表相同数量的轴。如果确实需要,甚至可以给它们提供不同的名称/标签/单位,然后使用xlabel / ylabel选项覆盖显示的标签。

现在要回答更真实的答案,HoloViews会在后台生成bokeh模型,然后将其渲染到屏幕上。您可以定义挂钩,这些挂钩可以在渲染散景图表示之前对其进行修改。我当然不推荐这种方法,但是您可以像以前的解决方案一样实现相同的目的:

ax_range = None
def hook(plot, element):
    global ax_range
    ax_range = plot.handles['x_range']

def hook2(plot, element):
    plot.state.x_range = ax_range

hv.Curve([1, 2, 3], 'x', 'y').opts(hooks=[hook]) + hv.Curve([1, 2, 3], 'x2', 'y').opts(hooks=[hook2], axiswise=True)

最后,我们可以使链接更明确,如果您喜欢这种方法,我建议您提出一个问题以要求将其包括在内。在HoloViews 1.11中引入了所谓的Links,我们可以像这样轻松地添加RangeLink

import param
from holoviews.plotting.links import Link

class RangeLink(Link):

    x_range = param.Boolean(default=True)
    y_range = param.Boolean(default=True)

    _requires_target = True

from holoviews.plotting.bokeh.callbacks import LinkCallback

class RangeLinkCallback(LinkCallback):

    def __init__(self, root_model, link, source_plot, target_plot):
        if link.x_range:
            target_plot.handles['x_range'] = source_plot.handles['x_range']    
            target_plot.state.x_range = source_plot.state.x_range
        if link.y_range:
            target_plot.handles['y_range'] = source_plot.handles['y_range']    
            target_plot.state.y_range = source_plot.state.y_range

RangeLink.register_callback('bokeh', RangeLinkCallback)

# Now we can use it to link the axes
curve = hv.Curve([1, 2, 3])
curve2 = hv.Curve([1, 2, 3])

RangeLink(curve, curve2, y_range=False)

curve + curve2.opts(axiswise=True)
相关问题