Turn a function into an interactive plot with a single line of code.
It is very similar to Holoviews DynamicMap but with multiple lines and plots capabilities, and with only sliders as interactive elements.
pip install sliderplot
from sliderplot import sliderplot
import numpy as np
def f(amplitude=1, frequency=np.pi, phase=np.pi / 2):
x = np.linspace(0, 10, 1000)
y = amplitude * np.sin(frequency * x + phase)
return x, y, "Hey"
sliderplot(
f,
params_bounds=((0, 1),),
titles=("Minimal example",),
page_title="Minimal example",
)
- Single line
- Multiple lines
- Multiple subplots
- Line labels
- Initial slider position
- Slider bounds settings
- Axes labels
- Plot title
- Web page title
To create a sliderplot with a single line, pass into sliderplot()
a function that returns same-length x
and y
vectors.
def f(amplitude, frequency, phase):
x = np.linspace(0, 10, 1000)
y = amplitude * np.sin(frequency * x + phase)
return x, y
sliderplot(f)
To create a sliderplot with multiple lines, pass into sliderplot()
a function that returns multiple pairs of
same-length x
and y
vectors.
def f(amplitude, frequency, phase):
x = np.linspace(0, 10, 1000)
y = amplitude * np.sin(frequency * x + phase)
return (x, y), (x, 2 * y), (x, 3 * y)
sliderplot(f)
To create a sliderplot with multiple subplots, pass into sliderplot()
a function that returns a list with the
following levels, top to bottom:
- List of subplots.
- List of lines.
- Line:
(x, y)
pair of same-length vectors, or(x, y, label: str)
to add a line label.
def f(amplitude, frequency, phase):
x = np.linspace(0, 10, 1000)
y = amplitude * np.sin(frequency * x + phase)
return ((x, y), (x, 2 * y)), ((x, 3 * y),)
sliderplot(f)
To add a label to a line that will be displayed in the plot legend, return the line data with the following format:
(x, y, label: str)
def f(amplitude, frequency, phase):
x = np.linspace(0, 10, 1000)
y = amplitude * np.sin(frequency * x + phase)
return (x, y, "First"), (x, 2 * y), (x, 3 * y, "Third")
sliderplot(f)
To set the slider initial value for a parameter, simply add a default argument to the function.
In the following example, the initial slider values are:
amplitude = 1
frequency = np.pi
phase = np.pi / 2
def f(amplitude=1, frequency=np.pi, phase=np.pi / 2):
x = np.linspace(0, 10, 1000)
y = amplitude * np.sin(frequency * x + phase)
return x, y
sliderplot(f)
Use the param_bounds
argument of the sliderplot()
function to specify the slider bounds of each parameter. It takes
a list of pairs of (min_value, max_value)
.
The first pair contains the bounds of the first argument, the second pair contains the bounds of the second argument, etc...
In the following example, the slider bounds are:
amplitude = (0, 1)
frequency = (1, 1000)
phase = (0, np.pi)
def f(amplitude, frequency, phase):
x = np.linspace(0, 10, 1000)
y = amplitude * np.sin(frequency * x + phase)
return x, y
sliderplot(f, params_bounds=((0, 1), (1, 1000), (0, np.pi)))
To add axes labels to the subplots, set the axes_labels
argument with a sequence of (x_label, y_label)
pair of
strings. The first
pair will set the axis labels of the first subplot, the second pair the axis labels of the second subplot, etc...
def f(amplitude, frequency, phase):
x = np.linspace(0, 10, 1000)
y = amplitude * np.sin(frequency * x + phase)
return ((x, y), (x, 2 * y)), ((x, 3 * y),)
sliderplot(f, axes_labels=(("x1", "y1"), ("x2", "y2")))
To add plot titles to subplots, set the titles
argument with a sequence of strings. The first
string will be the title of the first subplot, the second string the title of the second subplot, etc...
def f(amplitude, frequency, phase):
x = np.linspace(0, 10, 1000)
y = amplitude * np.sin(frequency * x + phase)
return ((x, y), (x, 2 * y)), ((x, 3 * y),)
sliderplot(f, titles=("Subplot 1", "Subplot2"))
To set the title of the web page that show the sliderplot, use the page_title
argument.
def f(amplitude=1, frequency=np.pi, phase=np.pi / 2):
x = np.linspace(0, 10, 1000)
y = amplitude * np.sin(frequency * x + phase)
return x, y
sliderplot(f, page_title="Page title")