主要使用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选项 axiswise = True 可以完美地自动调整不同的范围,但似乎不能仅针对单个轴(例如y轴)定义此范围,而同时保留链接的平移交互性x轴。
我该如何完成?非常感谢你!
答案 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)