Special-Widgets#

Traitlet-Widgets#

Widget-Properties sind IPython-Traitlets. Um Änderungen vorzunehmen, kann die Methode observe des Widgets zum Registrieren eines callback verwendet werden.

Weitere Informationen erhaltet ihr unter Traitlet events.

[1]:
import bqplot as bq
import ipywidgets as widgets
import numpy as np


### Create random data
size = 2000  # number of rows
scale = 1.0
scaleLocal = 20
np.random.seed(0)
x_data = np.arange(size)
y_data = (
    np.cumsum(np.random.randn(size) * scale)
    + np.random.randn(size) * scaleLocal
)


x_sc = bq.LinearScale()
y_sc = bq.LinearScale()

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

line1 = bq.Lines(
    x=x_data,
    y=y_data,
    scales={"x": x_sc, "y": y_sc},
    colors=["blue"],
    display_legend=False,
    labels=["y1"],
    stroke_width=1.0,
)

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

x_range = widgets.IntRangeSlider(
    value=[min(x_data), max(x_data)],
    min=min(x_data),
    max=max(x_data),
    step=(max(x_data) - min(x_data)) / 100,
    description="X Axis",
    disabled=False,
    continuous_update=False,
    orientation="horizontal",
    readout=True,
)


def updateXAxis(change):
    # Update X-axis min/max value here
    if change["type"] == "change" and change["name"] == "value":
        x_sc.min = change["new"][0]
        x_sc.max = change["new"][1]


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

Linking Widgets#

Beim Synchronisieren von Traitlet-Attributen tritt möglicherweise eine Verzögerung aufgrund der Latenz bei der Kommunikation mit dem Server auf. Ihr könnt die Widget-Attribute jedoch auch im Browser entweder uni- oder bidirektional direkt mit den Link-Widgets verknüpfen.

Diese Javascript-Links bleiben auch bestehen, wenn Widgets in HTML-Webseiten ohne Kernel eingebettet werden.

Weitere Informationen erhaltet ihr unter Linking widgets attributes from the client side.

[2]:
# Sliders to change minimum and maximum valuese on x scale of bqplot figure using jslink
x_rangeMin = widgets.IntSlider(
    min=min(x_data),
    max=max(x_data),
    step=(max(x_data) - min(x_data)) / 100,
    description="Min x scale: ",
    value=x_sc.min,
)
x_rangeMax = widgets.IntSlider(
    min=min(x_data),
    max=max(x_data),
    step=(max(x_data) - min(x_data)) / 100,
    description="Max x scale: ",
    value=x_sc.max,
)

widgets.jslink((x_sc, "min"), (x_rangeMin, "value"))
widgets.jslink((x_sc, "max"), (x_rangeMax, "value"))

widgets.VBox([fig, x_rangeMin, x_rangeMax])