In this quick tutorial, I'll show you how to create an animated scatterplot using the libraries matplotlib
or seaborn
and imageio
. Here's the GitHub repo of this project.
The scatterplot illustrates the relationship between life expectancy and fertility rate of world's countries from 1960 to 2015, based on the Gapminder data set:
country | year | population | life_expectancy | fertility_rate | continent | |
---|---|---|---|---|---|---|
0 | Afghanistan | 1800 | 3280000.0 | 28.21 | 7.0 | Asia |
The animated scatterplot is basically made of several overlapping static plots. Here's how to create the animation step-by-step:
1. Create static scatterplots for each year in the data set.
The scatterplots depict life_expectancy
on the x axis and fertility_rate
on the y axis. To make the plots even more insightful, the size of the points illustrates the population
number and their color illustrates the continent
.
import matplotlib.pyplot as plt
%matplotlib inline
import seaborn as sns
sns.scatterplot(x='life_expectancy',
y='fertility_rate',
hue='continent',
size='population',
sizes=(10, 1000),
legend=False,
data=gapminder_df.loc[gapminder_df['year']==year],
alpha=0.7,
palette='Set2')
plt.title(f'{year}', loc='center', fontsize=20, color='black', fontweight='bold')
plt.xlabel('Life expectancy')
plt.ylabel('Fertility rate')
2. Export the scatterplot images to a designated folder.
You need to save all the individual scatterplots, so that you can overlap the images in the next step.
import imageio
import os
images = []
folder='/path/to/folder/images'
if not os.path.exists(folder):
os.mkdir(folder)
3. Join the individual images in chronological order.
filename = f'lifeexp_{year}.png'
plt.savefig(os.path.join(folder,filename))
images.append(imageio.imread(os.path.join(folder,filename)))
4. Export the scatterplots sequence as a gif.
The fps
(frames per second) parameter sets the speed of the animation.
imageio.mimsave(os.path.join(folder,'scatterplot.gif'), images, fps=20)
Now, putting everything together, here's the full code and the animated scatterplot:
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
import seaborn as sns
import imageio
import os
images = []
folder='/home/lorena/Documents/bootcamp/W1/images'
if not os.path.exists(folder):
os.mkdir(folder)
for year in range(1960, 2016):
plt.axis((0, 100, 0, 10))
sns.scatterplot(x='life_expectancy',
y='fertility_rate',
hue='continent',
size='population',
sizes=(10, 1000),
legend=False,
data=gapminder_df.loc[gapminder_df['year']==year],
alpha=0.7,
palette='Set2')
plt.title(f'{year}', loc='center', fontsize=20, color='black', fontweight='bold')
#plt.title(f'inspired by Hans Rosling', loc='right', fontsize=10, color='grey', style='italic', pad=-20)
#plt.legend(bbox_to_anchor=(0.74, 0.85), loc='center')
plt.xlabel('Life expectancy')
plt.ylabel('Fertility rate')
#plt.annotate({country}, )
filename = f'lifeexp_{year}.png'
plt.savefig(os.path.join(folder,filename))
images.append(imageio.imread(os.path.join(folder,filename)))
plt.figure()
imageio.mimsave(os.path.join(folder,'scatterplot.gif'), images, fps=20)
Top comments (0)