Bird
Raised Fist0
Matplotlibdata~20 mins

Widget-based interactions (sliders, buttons) in Matplotlib - Practice Problems & Coding Challenges

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Challenge - 5 Problems
🎖️
Widget Interaction Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
Predict Output
intermediate
2:00remaining
Output of slider interaction code

What will be the output when you move the slider in this matplotlib widget example?

Matplotlib
import matplotlib.pyplot as plt
from matplotlib.widgets import Slider

fig, ax = plt.subplots()
plt.subplots_adjust(bottom=0.25)
x = range(10)
y = [i**2 for i in x]
line, = ax.plot(x, y)

ax_slider = plt.axes([0.25, 0.1, 0.65, 0.03])
slider = Slider(ax_slider, 'Scale', 0.1, 2.0, valinit=1)

def update(val):
    scale = slider.val
    line.set_ydata([i**2 * scale for i in x])
    fig.canvas.draw_idle()

slider.on_changed(update)
plt.show()
AThe code raises a TypeError because set_ydata expects a numpy array
BThe plot updates but x-values are scaled instead of y-values
CThe slider does not affect the plot because update is not connected
DThe plot updates dynamically scaling the y-values by the slider value
Attempts:
2 left
💡 Hint

Check what the update function changes when the slider moves.

data_output
intermediate
1:30remaining
Resulting data after button click

Given this matplotlib button widget code, what is the value of counter after clicking the button three times?

Matplotlib
import matplotlib.pyplot as plt
from matplotlib.widgets import Button

counter = 0

def on_click(event):
    global counter
    counter += 1

fig, ax = plt.subplots()
plt.subplots_adjust(bottom=0.2)
ax_button = plt.axes([0.7, 0.05, 0.1, 0.075])
button = Button(ax_button, 'Click me')
button.on_clicked(on_click)

# Simulate three clicks
for _ in range(3):
    on_click(None)

print(counter)
A3
B0
C1
DRaises NameError because counter is not global
Attempts:
2 left
💡 Hint

Look at how counter is updated inside the on_click function.

🔧 Debug
advanced
2:00remaining
Identify the error in slider update function

What error will this code raise when moving the slider?

Matplotlib
import matplotlib.pyplot as plt
from matplotlib.widgets import Slider

fig, ax = plt.subplots()
x = range(5)
y = [i*2 for i in x]
line, = ax.plot(x, y)

ax_slider = plt.axes([0.25, 0.1, 0.65, 0.03])
slider = Slider(ax_slider, 'Multiplier', 1, 5, valinit=1)

def update(val):
    scale = slider.val
    line.set_ydata([v * scale for v in y])
    fig.canvas.draw_idle()

slider.on_changed(update)
plt.show()
AValueError: x and y must have same first dimension
BAttributeError: 'Slider' object has no attribute 'val'
CTypeError: can't multiply list by float
DNo error, plot updates correctly
Attempts:
2 left
💡 Hint

Check the type of y and what happens when multiplying by scale.

visualization
advanced
2:00remaining
Effect of button on plot color

What happens to the plot color when the button is clicked in this code?

Matplotlib
import matplotlib.pyplot as plt
from matplotlib.widgets import Button

fig, ax = plt.subplots()
x = range(10)
y = [i for i in x]
line, = ax.plot(x, y, color='blue')

ax_button = plt.axes([0.7, 0.05, 0.1, 0.075])
button = Button(ax_button, 'Change Color')

colors = ['blue', 'green', 'red']
index = 0

def on_click(event):
    global index
    index = (index + 1) % len(colors)
    line.set_color(colors[index])
    fig.canvas.draw_idle()

button.on_clicked(on_click)
plt.show()
AThe plot color changes to red on first click and stays red
BThe plot color cycles through green, red, then back to blue on each click
CThe plot color changes to green on first click and stays green
DThe code raises SyntaxError due to 'nonlocal' usage
Attempts:
2 left
💡 Hint

Look at how index changes and how colors are assigned.

🚀 Application
expert
3:00remaining
Combining slider and button for interactive plot

In this code, what is the final y-data of the plot after moving the slider to 3 and clicking the button once?

Matplotlib
import matplotlib.pyplot as plt
from matplotlib.widgets import Slider, Button

fig, ax = plt.subplots()
x = range(4)
y = [1, 2, 3, 4]
line, = ax.plot(x, y)

ax_slider = plt.axes([0.25, 0.1, 0.65, 0.03])
slider = Slider(ax_slider, 'Multiplier', 1, 5, valinit=1)

ax_button = plt.axes([0.7, 0.05, 0.1, 0.075])
button = Button(ax_button, 'Add 10')

current_y = y.copy()

def update(val):
    nonlocal current_y
    scale = slider.val
    current_y = [v * scale for v in y]
    line.set_ydata(current_y)
    fig.canvas.draw_idle()

slider.on_changed(update)

def on_click(event):
    nonlocal current_y
    current_y = [v + 10 for v in current_y]
    line.set_ydata(current_y)
    fig.canvas.draw_idle()

button.on_clicked(on_click)

# Simulate slider move to 3
slider.set_val(3)
# Simulate button click
on_click(None)

print(current_y)
A[13, 16, 19, 22]
B[3, 6, 9, 12]
C[11, 12, 13, 14]
D[10, 20, 30, 40]
Attempts:
2 left
💡 Hint

First the slider multiplies original y by 3, then the button adds 10 to each element.

Practice

(1/5)
1. What is the main purpose of using sliders in matplotlib widget-based interactions?
easy
A. To save the plot as an image file
B. To trigger a one-time action when clicked
C. To display static text on the plot
D. To allow continuous adjustment of plot parameters interactively

Solution

  1. Step 1: Understand slider functionality

    Sliders let users change values smoothly and continuously, affecting the plot dynamically.
  2. Step 2: Compare with other widgets

    Buttons trigger actions on click, not continuous changes; text display and saving are unrelated.
  3. Final Answer:

    To allow continuous adjustment of plot parameters interactively -> Option D
  4. Quick Check:

    Sliders = continuous value change [OK]
Hint: Sliders adjust values smoothly; buttons act on clicks [OK]
Common Mistakes:
  • Confusing sliders with buttons
  • Thinking sliders trigger one-time actions
  • Assuming sliders display text
2. Which of the following is the correct way to import the slider widget from matplotlib.widgets?
easy
A. from matplotlib import Slider
B. import Slider from matplotlib.widgets
C. from matplotlib.widgets import Slider
D. import matplotlib.widgets.Slider

Solution

  1. Step 1: Recall Python import syntax

    The correct syntax to import a class from a module is: from module import ClassName.
  2. Step 2: Match with options

    from matplotlib.widgets import Slider matches this syntax exactly for Slider from matplotlib.widgets.
  3. Final Answer:

    from matplotlib.widgets import Slider -> Option C
  4. Quick Check:

    Correct import syntax = from matplotlib.widgets import Slider [OK]
Hint: Use 'from module import Class' syntax for widgets [OK]
Common Mistakes:
  • Using 'import Class from module' which is invalid
  • Trying to import directly from matplotlib
  • Using dot notation in import statement
3. What will be the output of the following code snippet?
import matplotlib.pyplot as plt
from matplotlib.widgets import Slider

fig, ax = plt.subplots()
plt.subplots_adjust(bottom=0.25)
ax_slider = plt.axes([0.25, 0.1, 0.65, 0.03])
slider = Slider(ax_slider, 'Val', 0, 10, valinit=5)
print(slider.val)
medium
A. 5
B. 10
C. 0
D. Error: Slider object has no attribute 'val'

Solution

  1. Step 1: Understand Slider initialization

    The slider is created with valinit=5, which sets its initial value to 5.
  2. Step 2: Check slider value attribute

    The current slider value is accessed by slider.val, which returns the initial value before any interaction.
  3. Final Answer:

    5 -> Option A
  4. Quick Check:

    Slider initial value = 5 [OK]
Hint: Slider.val shows current value, starts at valinit [OK]
Common Mistakes:
  • Assuming slider.val is zero by default
  • Expecting error accessing slider.val
  • Confusing slider.val with slider.valmin or valmax
4. Identify the error in this code snippet that tries to create a button widget:
import matplotlib.pyplot as plt
from matplotlib.widgets import Button

fig, ax = plt.subplots()
button_ax = plt.axes([0.7, 0.05, 0.1, 0.075])
button = Button(button_ax, 'Click Me')
button.on_clicked = lambda event: print('Button clicked!')
plt.show()
medium
A. The event handler should be connected using on_clicked() method, not by assignment
B. The on_clicked method should be called, not assigned
C. The button label must be a number, not a string
D. plt.axes() cannot be used to create button axes

Solution

  1. Step 1: Understand button event connection

    The correct way to connect a function to button clicks is using button.on_clicked(function), not by assigning to button.on_clicked.
  2. Step 2: Identify the error in code

    The code incorrectly assigns a lambda to button.on_clicked instead of calling button.on_clicked(lambda).
  3. Final Answer:

    The event handler should be connected using on_clicked() method, not by assignment -> Option A
  4. Quick Check:

    Use on_clicked(func), not on_clicked = func [OK]
Hint: Connect events with on_clicked(func), not by assignment [OK]
Common Mistakes:
  • Assigning function to on_clicked instead of calling it
  • Using wrong axes for button
  • Misunderstanding button label type
5. You want to create an interactive plot where a slider controls the frequency of a sine wave and a button resets the slider to its initial value. Which of the following code snippets correctly implements the button reset functionality?
hard
A. def reset(event): slider.val = slider.valinit button.on_clicked(reset)
B. def reset(event): slider.set_val(slider.valinit) button.on_clicked(reset)
C. def reset(): slider.set_val(slider.valinit) button.on_clicked(reset)
D. def reset(event): slider.valinit = 0 button.on_clicked(reset)

Solution

  1. Step 1: Understand slider reset method

    The slider widget provides set_val(value) method to update its value programmatically and trigger updates.
  2. Step 2: Check event handler signature and usage

    The reset function must accept an event argument and call slider.set_val(slider.valinit) to reset to initial value. def reset(event): slider.set_val(slider.valinit) button.on_clicked(reset) matches this.
  3. Final Answer:

    def reset(event): slider.set_val(slider.valinit) button.on_clicked(reset) -> Option B
  4. Quick Check:

    Use set_val(valinit) in event handler to reset slider [OK]
Hint: Use slider.set_val(valinit) inside button callback [OK]
Common Mistakes:
  • Assigning slider.val directly without set_val()
  • Missing event parameter in callback
  • Changing valinit instead of resetting slider value