Доступ к параметрам bokeh (рисунок) в пределах holoviews - PullRequest
0 голосов
/ 25 февраля 2019

В основном для использования десятичной операции holoviews я придерживаюсь holoviews, но я столкнулся с ограничениями в адаптации вывода bokeh в holoviews:

Для реализации «связанного панорамирования» в чистом боке,необходимо указать параметр, например, x_range в 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)

(полный пример: https://bokeh.pydata.org/en/latest/docs/user_guide/interaction/linking.html#userguide-interaction-linking)

Как я могу получить доступ и манипулировать бокефигуры, созданные holoviews?

Я бы хотел реализовать связанное панорамирование непосредственно внутри holoviews . Причина этого в том, чтобы сохранить интерактивность на участках с различнымидиапазоны .

Я знаю, опция holoviews по оси = True идеально настраивает различные диапазоны автоматически, но кажется, что это не может быть определено только для одной оси (например, оси y),сохраняя при этом связанную интерактивность панорамирования по оси X.

Как мне этого добиться? Большое спасибо!

1 Ответ

0 голосов
/ 26 февраля 2019

Есть несколько разных ответов на этот вопрос.Давайте начнем с самого быстрого исправления того, что вы пытаетесь сделать - связать одну ось, а не другую.Этого проще всего добиться, дав измерениям разные имена, например, просто назовите одно из измерений чем-то отличным от значения по умолчанию «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)
...