首先,为了使用全息视图的抽取运算,我坚持全息视图,但在调整全息视图中的bokeh输出时遇到了限制:
要在纯bokeh中实现“链接平移”,需要共享bokehs 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)关于:guide/interaction/linking.html#userguide-interaction-linking的完整示例
如何访问和操作全息视图所创建的bokeh数字?
我想要实现直接在全息视图中的链接平移。这样做的原因是,在具有不同范围的地块中保留了互动性。
我知道,全息视图选项axiswise=True完全可以自动调整不同的范围,但这似乎不能仅定义为单个轴(例如y轴),而在x轴上保持链接的平移交互作用。
我怎样才能做到这一点?非常感谢!
发布于 2019-02-26 02:29:23
这个问题有几个不同的答案。让我们从您所要做的最直接的修复开始,即连接一个轴,而不是另一个轴。这很容易通过赋予维度不同的名称来实现,例如,只需将其中一个维度命名为默认的'x‘或’y‘以外的维度:
hv.Curve([1, 2, 3], 'x', 'y') + hv.Curve([1, 2, 3], 'x', 'y2')准确地说,在这种情况下,轴的“标识”是由维度名称、标签和单位决定的。这使得表示相同数量的轴可以很容易地共享。如果你真的需要,你甚至可以给他们不同的名字/标签/单位,然后用xlabel/ylabel选项覆盖显示的标签。
现在,要回答更直截了当的答案,HoloViews在后台生成bokeh模型,然后将它们呈现到屏幕上。您可以定义钩子,它可以在呈现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中引入了所谓的链接,我们可以很容易地添加如下所示的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)https://stackoverflow.com/questions/54865757
复制相似问题