In [1]:
import ipywidgets as widgets
import numpy as np
import matplotlib.pyplot as plt
In [2]:
%matplotlib widget
In [3]:
def make_box_layout():
return widgets.Layout(
border='solid 1px black',
margin='0px 10px 10px 0px',
padding='5px 5px 5px 5px'
)
class Sines(widgets.HBox):
def __init__(self):
super().__init__()
output = widgets.Output()
self.x = np.linspace(0, 2 * np.pi, 100)
initial_color = '#FF00DD'
with output:
self.fig, self.ax = plt.subplots(constrained_layout=True, figsize=(5, 3.5))
self.line, = self.ax.plot(self.x, np.sin(self.x), initial_color)
self.fig.canvas.toolbar_position = 'bottom'
self.ax.grid(True)
# define widgets
int_slider = widgets.IntSlider(
value=1,
min=0,
max=10,
step=1,
description='freq'
)
color_picker = widgets.ColorPicker(
value=initial_color,
description='pick a color'
)
text_xlabel = widgets.Text(
value='',
description='xlabel',
continuous_update=False
)
text_ylabel = widgets.Text(
value='',
description='ylabel',
continuous_update=False
)
controls = widgets.VBox([
int_slider,
color_picker,
text_xlabel,
text_ylabel
])
controls.layout = make_box_layout()
out_box = widgets.Box([output])
output.layout = make_box_layout()
# observe stuff
int_slider.observe(self.update, 'value')
color_picker.observe(self.line_color, 'value')
text_xlabel.observe(self.update_xlabel, 'value')
text_ylabel.observe(self.update_ylabel, 'value')
text_xlabel.value = 'x'
text_ylabel.value = 'y'
# add to children
self.children = [controls, output]
def update(self, change):
"""Draw line in plot"""
self.line.set_ydata(np.sin(change.new * self.x))
self.fig.canvas.draw()
def line_color(self, change):
self.line.set_color(change.new)
def update_xlabel(self, change):
self.ax.set_xlabel(change.new)
def update_ylabel(self, change):
self.ax.set_ylabel(change.new)
Sines()