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])