Static plots are great, but sometimes you need more. Enter interactive plots - a game-changer in data visualization. With Matplotlib widgets, you can create plots that users can manipulate in real-time, offering a more engaging and insightful experience.
Before diving in, make sure you have Matplotlib installed. If not, you can easily install it using pip:
pip install matplotlib
Now, let's import the necessary modules:
import matplotlib.pyplot as plt from matplotlib.widgets import Slider, Button, RadioButtons import numpy as np
Let's start with a simple sine wave plot that we can manipulate:
fig, ax = plt.subplots() t = np.arange(0.0, 1.0, 0.001) a0 = 5 f0 = 3 s = a0 * np.sin(2 * np.pi * f0 * t) l, = plt.plot(t, s, lw=2)
This creates a basic sine wave plot. Now, let's add a slider to control the frequency:
ax_freq = plt.axes([0.25, 0.1, 0.65, 0.03]) freq_slider = Slider(ax_freq, 'Frequency', 0.1, 30.0, valinit=f0) def update(val): f = freq_slider.val l.set_ydata(a0 * np.sin(2 * np.pi * f * t)) fig.canvas.draw_idle() freq_slider.on_changed(update)
Now you have an interactive plot where you can adjust the frequency of the sine wave using a slider!
Let's add a reset button to return the plot to its initial state:
reset_ax = plt.axes([0.8, 0.025, 0.1, 0.04]) reset_button = Button(reset_ax, 'Reset') def reset(event): freq_slider.reset() reset_button.on_clicked(reset)
We can also add radio buttons to switch between different wave types:
wave_ax = plt.axes([0.025, 0.5, 0.15, 0.15]) radio = RadioButtons(wave_ax, ('sin', 'square', 'sawtooth')) def wave_type(label): hzs = freq_slider.val if label == 'sin': l.set_ydata(a0 * np.sin(2 * np.pi * hzs * t)) elif label == 'square': l.set_ydata(a0 * np.sign(np.sin(2 * np.pi * hzs * t))) elif label == 'sawtooth': l.set_ydata(a0 * (t * hzs % 1)) fig.canvas.draw_idle() radio.on_clicked(wave_type)
Here's the complete code for our interactive plot:
import matplotlib.pyplot as plt from matplotlib.widgets import Slider, Button, RadioButtons import numpy as np fig, ax = plt.subplots() plt.subplots_adjust(left=0.1, bottom=0.25) t = np.arange(0.0, 1.0, 0.001) a0 = 5 f0 = 3 s = a0 * np.sin(2 * np.pi * f0 * t) l, = plt.plot(t, s, lw=2) ax.set_ylim(-10, 10) ax_freq = plt.axes([0.25, 0.1, 0.65, 0.03]) freq_slider = Slider(ax_freq, 'Frequency', 0.1, 30.0, valinit=f0) def update(val): f = freq_slider.val l.set_ydata(a0 * np.sin(2 * np.pi * f * t)) fig.canvas.draw_idle() freq_slider.on_changed(update) reset_ax = plt.axes([0.8, 0.025, 0.1, 0.04]) reset_button = Button(reset_ax, 'Reset') def reset(event): freq_slider.reset() reset_button.on_clicked(reset) wave_ax = plt.axes([0.025, 0.5, 0.15, 0.15]) radio = RadioButtons(wave_ax, ('sin', 'square', 'sawtooth')) def wave_type(label): hzs = freq_slider.val if label == 'sin': l.set_ydata(a0 * np.sin(2 * np.pi * hzs * t)) elif label == 'square': l.set_ydata(a0 * np.sign(np.sin(2 * np.pi * hzs * t))) elif label == 'sawtooth': l.set_ydata(a0 * (t * hzs % 1)) fig.canvas.draw_idle() radio.on_clicked(wave_type) plt.show()
This is just the tip of the iceberg when it comes to interactive plots with Matplotlib. You can create more complex interactions, combine different widget types, or even link multiple plots together.
Some ideas to explore:
Remember, the key to creating effective interactive plots is to think about what aspects of your data users might want to explore or manipulate. Happy plotting!
05/11/2024 | Python
25/09/2024 | Python
26/10/2024 | Python
08/11/2024 | Python
08/12/2024 | Python
26/10/2024 | Python
15/11/2024 | Python
26/10/2024 | Python
14/11/2024 | Python
05/10/2024 | Python
15/11/2024 | Python
06/10/2024 | Python