Динамически настраивать оси в bqplot - PullRequest
0 голосов
/ 29 августа 2018

Я работаю над приборной панелью на основе jupyter для анализа данных и планирую использовать bqplot для построения графиков данных. Частью спецификации для приборной панели является возможность регулировки осей, чтобы можно было увеличивать или уменьшать масштаб данных. До сих пор мне удавалось динамически обновлять это без необходимости полностью перезагружать фигуру. Есть ли способ сделать это? Если так, то как? Ниже приведен фрагмент примерно того, что я имею в виду:

def updateXAxis(values):
    #Update X-axis min/max value here

x_sc = LinearScale(min=float(x_data[0]))
y_sc = LinearScale()

ax_x = Axis(label='X', scale=x_sc, grid_lines='solid', tick_format='0f')
ax_y = Axis(label='Y', scale=y_sc, orientation='vertical', tick_format='0.2f')

m_fig = dict(left=100, top=50, bottom=50, right=100)
fig = Figure(axes=[ax_x, ax_y], marks=data_values, fig_margin=m_fig)

x_range = IntRangeSlider(value=[0,1000],
                        min=0,
                        max=2000,
                        step=1,
                        description="X Axis",
                        disabled=False,
                        continuous_update=False,
                        orientation='horizontal',
                        readout=True)
interactive(updateXAxis, values=x_range)
fig

Ответы [ 2 ]

0 голосов
/ 31 августа 2018

Проблема здесь заключалась в том, что функция interactive не очень гибкая. Вместо этого следует использовать observe, ниже приведен пример:

def updateXAxis(values):
    if change['type'] == 'change' and change['name'] == 'value':
        x_sc.min = change['new'][0]
        x_sc.max = change['new'][1]

x_sc = LinearScale(min=float(x_data[0]))
y_sc = LinearScale()

ax_x = Axis(label='X', scale=x_sc, grid_lines='solid', tick_format='0f')
ax_y = Axis(label='Y', scale=y_sc, orientation='vertical', tick_format='0.2f')

m_fig = dict(left=100, top=50, bottom=50, right=100)
fig = Figure(axes=[ax_x, ax_y], marks=data_values, fig_margin=m_fig)

x_range = IntRangeSlider(value=[0,1000],
                        min=0,
                        max=2000,
                        step=1,
                        description="X Axis",
                        disabled=False,
                        continuous_update=False,
                        orientation='horizontal',
                        readout=True)

x_range.observe(updateXAxis)
widgets.VBox([fig, x_range])

Есть немного более подробный ответ на этот вопрос в проблеме git, которую я здесь написал: https://github.com/bloomberg/bqplot/issues/712

0 голосов
/ 30 августа 2018

В bqplot уже есть встроенный интерактив для панорамирования и масштабирования, я не думаю, что вам нужно создавать свои собственные взаимодействия. Посмотрите на примеры в этом блокноте.

https://github.com/bloomberg/bqplot/blob/master/examples/Interactions/Interaction%20Layer.ipynb.

Вам нужно добавить дополнительную строку, чтобы построить взаимодействие. Вы можете передать одну или две шкалы в словаре, здесь я ограничил х. Затем передайте объект PanZoom с интерактивным kwarg при создании рисунка.

panzoom = PanZoom(scales={'x': [x_sc]})
fig = Figure(axes=[ax_x, ax_y], marks=[data_values], fig_margin=m_fig, interaction=panzoom)

Полный пример:

from bqplot import *
from ipywidgets import *
import numpy as np

x_data = np.linspace(1,101)
y_data = np.linspace(1,101)
x_sc = LinearScale()
y_sc = LinearScale()

ax_x = Axis(label='X', scale=x_sc, grid_lines='solid', tick_format='0f')
ax_y = Axis(label='Y', scale=y_sc, orientation='vertical', tick_format='0.2f')

scatter = Scatter(x=x_data, y=y_data, scales={'x': x_sc, 'y': y_sc})

m_fig = dict(left=100, top=50, bottom=50, right=100)
panzoom = PanZoom(scales={'x': [x_sc]})
fig = Figure(axes=[ax_x, ax_y], marks=[scatter], fig_margin=m_fig, interaction=panzoom)

x_range = IntRangeSlider(value=[0,1000],
                        min=0,
                        max=2000,
                        step=1,
                        description="X Axis",
                        disabled=False,
                        continuous_update=False,
                        orientation='horizontal',
                        readout=True)

fig
...