gpt4 book ai didi

python - 访问全息 View 中的 Bokeh (图形)参数

转载 作者:行者123 更新时间:2023-12-01 08:18:04 25 4
gpt4 key购买 nike

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

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

如何访问和操作 Holoviews 创建的 Bokeh 图形?

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

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

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

最佳答案

这个问题有几种不同的答案。让我们从最直接的解决方法开始,解决您正在尝试做的事情,即链接一个轴而不是另一个轴。通过为尺寸指定不同的名称,最容易实现这一点,例如只需将其中一个维度命名为默认的“x”或“y”以外的名称即可:

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

更准确地说,在这种情况下,轴的“身份”是由维度名称、标签和单位决定的。这使得表示相同数量的轴可以轻松共享。如果您确实需要,您甚至可以给它们不同的名称/标签/单位,然后使用 xlabel/ylabel 选项覆盖显示的标签。

现在要回答更字面的答案,HoloViews 在后台生成 Bokeh 模型,然后将它们渲染到屏幕上。您可以定义可以在渲染 Bokeh 图表示之前修改它的钩子(Hook)。我当然不会推荐这种方法,但您可以实现与之前的解决方案相同的效果,如下所示:

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)

关于python - 访问全息 View 中的 Bokeh (图形)参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54865757/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com