Есть несколько разных ответов на этот вопрос.Давайте начнем с самого быстрого исправления того, что вы пытаетесь сделать - связать одну ось, а не другую.Этого проще всего добиться, дав измерениям разные имена, например, просто назовите одно из измерений чем-то отличным от значения по умолчанию «x» или «y»:
hv.Curve([1, 2, 3], 'x', 'y') + hv.Curve([1, 2, 3], 'x', 'y2')
Чтобы быть очень точным, «идентичность»оси в этом случае определяется именем измерения, меткой и единицей измерения.Это позволяет легко совместно использовать оси, представляющие одинаковые величины.Если вам действительно нужно, вы можете даже дать им разные имена / метки / единицы измерения, а затем переопределить отображаемую метку параметрами 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)
Наконец, мы могли бы сделать ссылку более явной, и если вам нравится этот подход, я бы порекомендовал вамподать вопрос, чтобы попросить его включить.В 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)