In [1]:
import numpy as np
import pandas as pd
import plotly.express as px 

pd.options.plotting.backend = "plotly"

Note : Les graphiques étant dynamiques, ils doivent être regénérés (avec Cell -> Run all) lorsqu'on ouvre cette feuille et les suivantes de ce chapitre.

Nuages de points¶

Dans certains cas un nuage de point, avec chaque point qui représente un événement ou un élément, est une représentation très parlante, encore plus si on peut l'animer et suivre son évolution dans le temps.

Les données¶

On récupère du site GapMinder des données sur la population mondiale avec l'idée que chaque pays sera un point sur le graphe et on choisi ce qu'on met sur les axes x et y (on va commencer avec en x les revenus par habitant et en y le nombre d'enfants par femme). Là encore, le but d'un tel graphe est de trouver des corrélations.

Plotly a une base de jeux de données, présentée ici, qui contient GapMinder.

In [2]:
df = px.data.gapminder()
df.head()
Out[2]:
country continent year lifeExp pop gdpPercap iso_alpha iso_num
0 Afghanistan Asia 1952 28.801 8425333 779.445314 AFG 4
1 Afghanistan Asia 1957 30.332 9240934 820.853030 AFG 4
2 Afghanistan Asia 1962 31.997 10267083 853.100710 AFG 4
3 Afghanistan Asia 1967 34.020 11537966 836.197138 AFG 4
4 Afghanistan Asia 1972 36.088 13079460 739.981106 AFG 4

Un nuage de point basique¶

Pour commencer dessinons un simple nuage de points avec la commande scatter. Pour enrichir la figure on ajoute la couleur du continent pour chaque pays et son nom lorsqu'on passe la souris dessus un point :

In [3]:
px.scatter(df[df.year == 1982], x='gdpPercap', y='lifeExp', color="continent", hover_name="country")

On constate que la croissance est très rapide au début puis lente ensuite. Si on échange les axes x et y on a une courbe exponentielle. Cela est dû au fait que les revenus évoluent en termes multiplicatifs (gagner 2 SMIC et non SCMI + x). Aussi utilisons une échelle logarithmique pour voir s'il y a un relation plus nette entre l'espérance de vie et les revenus par habitant.

In [4]:
px.scatter(df[df.year == 1982], x='gdpPercap', y='lifeExp', color="continent", hover_name="country", log_x=True)

On a quasiment une droite qui indique que l'espérance de vie est en logarithme des revenus par habitants (en 1992).

D'autre part cela séparer mieux les données ce qui est toujours bon.

Des bulles pour une dimension de plus¶

On peut utiliser la taille des points pour transmettre une information supplémentaire.

In [5]:
continent_colors = {'Asia':'gold', 'Europe':'green', 'Africa':'brown', 'Oceania':'red', 'Americas':'navy'}

fig = px.scatter(df[df.year == 2007], x='gdpPercap', y='lifeExp', color="continent", hover_name="country", log_x=True,
                 color_discrete_map=continent_colors, title="World in 2007",
                 size='pop', size_max=50)
fig

N'oubliez pas que vous pouvez cliquer sur la légende pour faire apparaître ou disparaître un continent !

S'il est possible de sauver l'image au format png avec l'icone d'appareil photo au dessus du graphique, on peut aussi sauver sous forme vectorielle, en PDF ou en SVG.

In [6]:
fig.write_image("/tmp/gapminder_2007.pdf") # Supported formats: 'png', 'jpg', 'jpeg', 'webp', 'svg', 'pdf', 'eps', 'json'

Une animation avec tout inclus !¶

Pour parfaire le tout, on ajoute une animation qui fait défiler les années :

In [7]:
fig = px.scatter(df, x='gdpPercap', y='lifeExp', color="continent", hover_name="country", log_x=True,
                 color_discrete_map=continent_colors, title="World stats between 1952 and 2007",
                 size='pop', size_max=50,
                 animation_frame="year", animation_group="country", range_x=[100,100000], range_y=[25,90])
fig
In [ ]: