scientist and professor, I typically want to elucidate the internal workings of studying algorithms and mathematical ideas, whether or not in technical displays, classroom lectures, or written articles. In lots of instances, static plots can present the ultimate final result, however they typically fall quick in the case of illustrating the underlying course of.
On this context, animations could make a big distinction. By presenting a sequence of frames, every exhibiting a plot that represents a step within the course of, you may higher seize your viewers’s consideration and extra successfully clarify complicated ideas and workflows.
This tutorial will present you learn how to use Python and Matplotlib to deliver scientific concepts to life by means of animation. Whether or not you’re a knowledge scientist visualizing a Machine Learning algorithm, a physics trainer demonstrating harmonic movement, or a technical author aiming to convey math intuitively, this information is for you.
We’ll discover the next matters:
- Primary animation setup with Matplotlib
- Math instance
- Physics Instance
- Animating machine studying algorithms
- Exporting animations for internet and displays
1. Primary animation setup with Matplotlib
Let’s introduce the FuncAnimation
class from Matplotlib’s Animation package deal by animating the sine operate. The next steps could be replicated nearly in each case.
- Import required libraries
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
FuncAnimation
from matplotlib.animation
is the category that lets you create animations by repeatedly calling an replace operate.
- Defining the plotted information (sine operate)
x = np.linspace(0, 2 * np.pi, 1000)
y = np.sin(x)
y = np.sin(x)
computes the sine of every x-value. That is the preliminary sine wave that shall be plotted.
- Creating the preliminary plot
Python">fig, ax = plt.subplots()
line, = ax.plot(x, y)
ax.set_ylim(-1.5, 1.5)
line, = ax.plot(x, y)
plots the preliminary sine wave and shops the road object in line
.
Be aware: The comma after
line
is necessary: it unpacks the single-element tuple returned byplot
.
- Defining the Replace Perform
def replace(body):
line.set_ydata(np.sin(x + body / 10))
return line,
np.sin(x + body / 10)
shifts the sine wave horizontally, creating the impact of a shifting wave.
- Creating and displaying the animation
ani = FuncAnimation(fig, replace, frames=100, interval=50, blit=True)
plt.present()
That ties every little thing collectively to create the animation:
fig
: the determine to animate.replace
: the operate to name for every body.frames=100
: the variety of frames within the animation.interval=50
: delay between frames in milliseconds (50 ms = 20 frames per second).blit=True
: optimizes efficiency by solely redrawing elements of the plot that change.
2. Animating Physics: Indirect Launch
We’ll present learn how to animate a traditional instance in physics courses: the Indirect Launch. We’ll comply with comparable steps to the essential instance proven earlier than.
- Defining movement parameters and the time vector
g = 9.81 # gravity (m/s^2)
v0 = 20 # preliminary velocity (m/s)
theta = np.radians(45) # launch angle in radians
# complete time the projectile shall be within the air
t_flight = 2 * v0 * np.sin(theta) / g
# time vector with 100 equally spaced values between 0 and t_flight
t = np.linspace(0, t_flight, 100)
x = v0 * np.cos(theta) * t # horizontal place at time t
y = v0 * np.sin(theta) * t - 0.5 * g * t**2 # vertical place at time t
fig, ax = plt.subplots()
ax.set_xlim(0, max(x)*1.1)
ax.set_ylim(0, max(y)*1.1)
ax.set_title("Indirect Launch")
ax.set_xlabel("Distance")
ax.set_ylabel("Peak")
line, = ax.plot([], [], lw=2)
level, = ax.plot([], [], 'ro') # pink dot for projectile
On this instance, we’ll use an initialization operate to set every little thing to an empty state. It returns the plot parts to be up to date in the course of the animation.
def init():
line.set_data([], [])
level.set_data([], [])
return line, level
- Replace operate and animation
def replace(body):
line.set_data(x[:frame], y[:frame]) # trajectory as much as present body
level.set_data(x[frame], y[frame]) # present projectile place
return line, level
The replace operate is known as at every body. The body parameter indexes into the time array, so x[frame]
and y[frame]
give present coordinates.
ani = FuncAnimation(fig, replace, frames=len(t), init_func=init, blit=True, interval=30)
frames=len(t)
: complete variety of animation steps.
interval=30
: time (in milliseconds) between frames (~33 fps).
blit=True
: improves efficiency by solely redrawing elements of the body that modified.

3. Animating Math: Fourier Sequence
Within the following instance, we’ll present learn how to construct a sq. wave from sine features utilizing the Fourier Remodel.
- Creating x values and a plot determine
x = np.linspace(-np.pi, np.pi, 1000)
y = np.zeros_like(x)
fig, ax = plt.subplots()
line, = ax.plot(x, y, lw=2)
# Setting textual content labels and axis limits
ax.set_title("Fourier Sequence Approximation of a Sq. Wave")
ax.set_ylim(-1.5, 1.5)
ax.set_xlim(-np.pi, np.pi)
textual content = ax.textual content(-np.pi, 1.3, '', fontsize=12)
x
: An array of 1000 evenly spaced factors from −π to π, which is the standard area for periodic Fourier sequence.
y
: Initializes a y-array of zeros, identical form as x
.
- Defining the Fourier Sequence operate
The formulation used for the Fourier Sequence is given by:

def fourier_series(n_terms):
outcome = np.zeros_like(x)
for n in vary(1, n_terms * 2, 2): # Solely odd phrases: 1, 3, 5, ...
outcome += (4 / (np.pi * n)) * np.sin(n * x)
return outcome
- Setting the Replace Perform
def replace(body):
y = fourier_series(body + 1)
line.set_ydata(y)
textual content.set_text(f'{2*body+1} phrases')
return line, textual content
This operate updates the plot at every body of the animation:
- It computes a brand new approximation with
body + 1
phrases. - Updates the y-values of the road.
- Updates the label to indicate what number of phrases are used (e.g., “3 phrases”, “5 phrases”, and many others.).
- Returns the up to date plot parts to be redrawn.
- Creating the visualization
ani = FuncAnimation(fig, replace, frames=20, interval=200, blit=True)
plt.present()

4. Machine Studying in Motion: Gradient Descent
Now, we’ll present how the classical machine studying algorithm finds a minimal on a three-dimensional parabolic operate.
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
# Outline the operate and its gradient
def f(x, y):
return x**2 + y**2
def grad_f(x, y):
return 2*x, 2*y
# Initialize parameters
lr = 0.1
steps = 50
x, y = 4.0, 4.0 # begin level
historical past = [(x, y)]
# Carry out gradient descent
for _ in vary(steps):
dx, dy = grad_f(x, y)
x -= lr * dx
y -= lr * dy
historical past.append((x, y))
# Extract coordinates
xs, ys = zip(*historical past)
zs = [f(xi, yi) for xi, yi in history]
# Put together 3D plot
fig = plt.determine()
ax = fig.add_subplot(111, projection='3d')
X, Y = np.meshgrid(np.linspace(-5, 5, 100), np.linspace(-5, 5, 100))
Z = f(X, Y)
ax.plot_surface(X, Y, Z, alpha=0.6, cmap='viridis')
level, = ax.plot([], [], [], 'ro', markersize=6)
line, = ax.plot([], [], [], 'r-', lw=1)
# Animation features
def init():
level.set_data([], [])
level.set_3d_properties([])
line.set_data([], [])
line.set_3d_properties([])
return level, line
def replace(i):
level.set_data(xs[i], ys[i])
level.set_3d_properties(zs[i])
line.set_data(xs[:i+1], ys[:i+1])
line.set_3d_properties(zs[:i+1])
return level, line
ani = FuncAnimation(fig, replace, frames=len(xs), init_func=init, blit=True, interval=200)

5. Exporting animations for internet and displays
Lastly, to export the animated plots to a file, you should use the animation.save()
operate.
# Export as GIF (non-compulsory)
ani.save("launch.gif", author='pillow', fps=30)
Within the instance above, the operate takes the FuncAnimation
object, renders it body by body utilizing the Pillow library, and exports the outcome as a .gif
file known as launch.gif
at 30 frames per second.
Conclusion
On this article, we noticed how the animation class from matplotlib could be useful for demonstrating the internal workings of algorithms, mathematical, and bodily processes. The examples explored on this article could be expanded to create impactful visuals for weblog posts, lectures, and experiences.
So as to make the current article much more worthwhile, I recommend utilizing the examples proven to create your individual animations and simulate processes associated to your area.
Take a look at my GitHub repository, which has full code examples and animations accessible here.
References
[1] GeeksforGeeks. Utilizing Matplotlib for animations. https://www.geeksforgeeks.org/using-matplotlib-for-animations/
[2] TutorialsPoint. Matplotlib – Animations. https://www.tutorialspoint.com/matplotlib/matplotlib_animations.htm
[3] The Matplotlib Growth Staff. Animations utilizing Matplotlib. https://matplotlib.org/stable/users/explain/animations/animations.html