在全息视图中访问散景(图形)参数

Accessing bokeh (figure) parameters within holoviews

主要是为了使用 holoviews 的抽取操作,我坚持使用 holoviews,但我 运行 在调整 holoviews 内的散景输出方面受到限制:

要在纯散景中实现“联动平移”,需要分享例如x_range 散景中的参数 bokeh.plotting.figure.Figure 对象

# 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://docs.bokeh.org/en/latest/docs/user_guide/interaction/linking.html#userguide-interaction-linking

如何访问和操作全息视图创建的散景图?

我想直接在全息视图中实现链接平移。 这样做的原因是,为了 在具有 不同 运行ges.

的地块中保持交互性

我知道,全息视图选项 axiswise=True 可以完美地自动调整不同的 运行ges 但似乎这不能仅针对单个轴定义(例如 y-轴),同时在 x 轴上保留链接的平移交互性。

我怎样才能做到这一点?非常感谢!

这个问题有几个不同的答案。让我们从最直接的解决方法开始,即针对 link 一个轴而不是另一个轴。这最容易通过给维度不同的名称来实现,例如只需将其中一个维度命名为默认值 'x' 或 'y':

以外的名称
hv.Curve([1, 2, 3], 'x', 'y') + hv.Curve([1, 2, 3], 'x', 'y2')

准确地说,本例中轴的"identity"是由维度名称、标签和单位决定的。这允许轻松共享表示相同数量的轴。如果你真的需要,你甚至可以给他们不同的 names/labels/units 然后用 xlabel/ylabel 选项覆盖显示的标签。

现在回答你答案的更直白的版本,HoloViews 在后台生成散景模型,然后将它们渲染到屏幕上。您可以定义挂钩,这些挂钩可以在渲染之前修改散景图表示。我当然不会推荐这种方法,但您可以像这样实现与以前的解决方案相同的效果:

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)

最后,我们可以使 linking 更明确,如果您喜欢这种方法,我建议您提交问题以请求将其包含在内。在 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)