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.
df = px.data.gapminder()
df.head()
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 :
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.
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.
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.
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 :
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