Le nuage de points (ou scatter plot en anglais) est un type de graphique utilisé pour représenter des données en deux dimensions (ou plus). Le nuage de points est utilisé pour visualiser la relation entre deux (ou plus) variables continues. Il peut être utilisé pour détecter des tendances, des modèles ou des outliers dans les données.
Dans Matplotlib, le nuage de points peut être créé avec la fonction scatter()
du module pyplot. Dans le cas d'un nuage de points en deux dimensions, cette fonction prend en entrée deux listes ou tableaux NumPy, représentant les valeurs de chaque axe.
Voici un exemple simple de création d'un nuage de points avec Matplotlib :
import numpy as np
import matplotlib.pyplot as plt
# On crée un nuage de points dispersés aléatoirement autour de la droite y = 0.8x + 4.
x = np.linspace(-10, 10, 20)
y = 0.8 * x + 4 + np.random.randn(x.size)
# On trace le nuage de points
plt.title("Un premier nuage de points")
plt.scatter(x, y)
# Affichage de la figure (surtout utile, si MPL est utilisé de manière standalone)
plt.show()
Vous pouvez bien entendu tracé en parallèle un nuage de points et une courbe, comme le montre l'exemple suivant.
import numpy as np
import matplotlib.pyplot as plt
# On crée un nuage de points dispersés aléatoirement autour de la droite y = 0.8x + 4.
x = np.linspace(-10, 10, 20)
y = 0.8 * x + 4 + np.random.randn(x.size)
# On trace le nuage de points
plt.title("Un premier nuage de points")
plt.scatter(x, y)
# On trace la droite autour de laquelle les points sont répartis
plt.plot(x, 0.8 * x + 4, "r")
# Affichage de la figure (surtout utile, si MPL est utilisé de manière standalone)
plt.show()
L'exemple suivant vous montre comment utiliser un scatter pour regrouper ("clusteriser", pour peu qu'on accepte ce verbe) les données présentes dans un nuage de points.
import matplotlib.pyplot as plt
import numpy as np
# On crée un nuage de points dispersés aléatoirement autour de la droite y = 0.8x + 4.
x = np.linspace(-10, 10, 20)
y = 0.8 * x + 4 + np.random.randn(x.size) * 3
# On prépare nos couleurs : le where crée un tableau de même taille que x et y.
colors = np.where(y >= 0.8*x+4, "red", "blue")
print(colors)
# Création du scatter plot avec nos x, y et couleurs.
plt.scatter(x, y, c=colors)
# Décoration du graphique.
plt.title("Clusters")
plt.xlabel("Variable X")
plt.ylabel("Variable Y")
# Ajout de la droite 0.8x + 4
x_line = np.linspace(x.min(), x.max(), 100)
y_line = 0.8 * x_line + 4
plt.plot(x_line, y_line, color="green")
# Affichage de la figure (surtout utile, si MPL est utilisé de manière standalone)
plt.show()
['blue' 'blue' 'blue' 'red' 'blue' 'blue' 'red' 'blue' 'red' 'red' 'red' 'blue' 'red' 'red' 'blue' 'blue' 'blue' 'blue' 'red' 'blue']
Pour arriver à nos fins, nous allons utiliser la couleur et la taille des points pour représenter les deux autres dimensions. Voici une première variante de code montrant ces possibilités.
import numpy as np
import matplotlib.pyplot as plt
# Le nombre de points dans notre nuage de points.
size = 50
# On prépare notre jeu de données en 4D.
x = np.arange(size)
y = 0.8 * x + 4 + np.random.randn(size) * 5
sizes = np.random.randint(0, 100, size)
colors = np.random.randint(0, 100, size)
# On décore un peu le graphique.
plt.title("Un jeu de données en 4D présenté via un scatter en 2D")
plt.xlabel("X values")
plt.ylabel("Y values")
# On dessine le nuage de points.
plt.scatter(x, y, c=colors, s=sizes)
# Affichage de la figure (surtout utile, si MPL est utilisé de manière standalone)
plt.show()
Vous pouvez aussi utiliser un dictionnaire à quatre entrées comme source de données du scatter. Voici une seconde variante possible.
import numpy as np
import matplotlib.pyplot as plt
# Le nombre de points dans notre nuage de points.
size = 50
# On prépare notre jeu de données en 4D. Les ordonnées ne peuvent pas être définies directement
# dans le dictionnaire, car sinon, les y ne pourraient pas dépendre de valeurs en x.
data = {
"x_values": np.arange(size),
"sizes": np.random.randint(0, 100, size),
"colors": np.random.randint(0, 100, size)
}
data["y_values"] = 0.8 * data["x_values"] + 4 + np.random.randn(size) * 5
# On décore un peu le graphique.
plt.title("Un jeu de données en 4D présenté via un scatter en 2D")
plt.xlabel("X values")
plt.ylabel("Y values")
# On affiche le scatter en le liant à notre jeu de données (paramètres nommé data).
plt.scatter("x_values", "y_values", c="colors", s="sizes", data=data)
# Affichage de la figure (surtout utile, si MPL est utilisé de manière standalone)
plt.show()
Vous pouvez changer la palette de couleurs utilisée par votre Scatter, en utilisant le paramètre nommé cmap
(color map).
Pour facilement choisir sa palette de couleurs, vous pouvez consulter ce document : https://matplotlib.org/cheatsheets/_images/cheatsheets-2.png
Vous retrouverez ce document, ainsi que quelques autres, sur la page web suivante : https://matplotlib.org/cheatsheets/
# On affiche le scatter en le liant à notre jeu de données (paramètres nommé data).
plt.scatter("x_values", "y_values", c="colors", s="sizes", data=data, cmap="jet")
<matplotlib.collections.PathCollection at 0x7f67378c3610>