Matplotlib Nuage de Points : Guide Complet de plt.scatter()
Updated on
Les nuages de points sont la visualisation incontournable pour explorer les relations entre deux variables numériques. Mais créer des nuages de points efficaces -- qui révèlent les motifs, les clusters et les valeurs aberrantes sans devenir un fouillis -- nécessite plus qu'un simple appel à plt.scatter(). Vous avez besoin du mappage de couleurs pour les catégories, de l'encodage de taille pour une troisième variable, d'étiquettes d'axes appropriées et de la gestion des points qui se chevauchent.
Le plt.scatter() de Matplotlib gère tout cela avec un riche ensemble de paramètres. Ce guide couvre tout, des nuages de points basiques aux techniques avancées comme les graphiques à bulles, les lignes de régression et les matrices de nuages de points multipanneaux.
Nuage de Points Basique
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(42)
x = np.random.randn(100)
y = 2 * x + np.random.randn(100) * 0.5
plt.figure(figsize=(8, 6))
plt.scatter(x, y)
plt.xlabel('Valeurs X')
plt.ylabel('Valeurs Y')
plt.title('Nuage de Points Basique')
plt.show()Personnalisation des Marqueurs
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(42)
x = np.random.randn(50)
y = np.random.randn(50)
plt.figure(figsize=(8, 6))
plt.scatter(x, y,
s=100, # taille du marqueur
c='steelblue', # couleur
marker='o', # forme du marqueur
alpha=0.7, # transparence
edgecolors='black', # couleur du bord
linewidths=0.5, # largeur du bord
)
plt.xlabel('X')
plt.ylabel('Y')
plt.title('Nuage de Points Personnalisé')
plt.show()Formes de Marqueurs Courantes
| Marqueur | Symbole | Description |
|---|---|---|
'o' | Cercle | Par défaut |
's' | Carré | |
'^' | Triangle haut | |
'D' | Losange | |
'*' | Étoile | |
'+' | Plus | |
'x' | Croix | |
'.' | Point | Petit, pour données denses |
Couleur par Catégorie
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(42)
n = 50
# Trois catégories
categories = ['A', 'B', 'C']
colors = ['#e74c3c', '#3498db', '#2ecc71']
plt.figure(figsize=(8, 6))
for cat, color in zip(categories, colors):
x = np.random.randn(n) + (categories.index(cat) * 2)
y = np.random.randn(n) + (categories.index(cat) * 1.5)
plt.scatter(x, y, c=color, label=cat, alpha=0.7, s=60, edgecolors='white')
plt.xlabel('Caractéristique 1')
plt.ylabel('Caractéristique 2')
plt.title('Nuage de Points Coloré par Catégorie')
plt.legend()
plt.show()Mappage de Couleur (Variable Continue)
Utilisez le paramètre c avec un tableau numérique et une palette de couleurs pour encoder une troisième variable en couleur :
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(42)
x = np.random.randn(200)
y = np.random.randn(200)
values = x ** 2 + y ** 2 # Distance depuis l'origine
plt.figure(figsize=(8, 6))
scatter = plt.scatter(x, y, c=values, cmap='viridis', s=50, alpha=0.8)
plt.colorbar(scatter, label="Distance depuis l'Origine")
plt.xlabel('X')
plt.ylabel('Y')
plt.title('Nuage de Points avec Mappage de Couleur')
plt.show()Palettes de Couleurs Populaires
| Palette | Type | Idéal Pour |
|---|---|---|
'viridis' | Séquentiel | Par défaut, perceptuellement uniforme |
'plasma' | Séquentiel | Contraste élevé |
'coolwarm' | Divergent | Valeurs positives/négatives |
'RdYlGn' | Divergent | Plages bon/mauvais |
'Set1' | Qualitatif | Données catégorielles |
Encodage de Taille (Graphique à Bulles)
Encodez une troisième variable comme taille de marqueur pour créer un graphique à bulles :
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(42)
countries = ['US', 'China', 'India', 'Germany', 'Japan', 'UK', 'Brazil', 'France']
gdp = np.array([21.43, 14.34, 2.87, 3.86, 5.08, 2.83, 1.87, 2.72])
population = np.array([331, 1402, 1380, 83, 126, 67, 213, 67])
growth = np.array([2.3, 5.8, 6.5, 1.1, 0.8, 1.4, 1.2, 1.5])
plt.figure(figsize=(10, 7))
scatter = plt.scatter(gdp, growth,
s=population * 2, # Mise à l'échelle de la population pour des tailles visibles
c=range(len(countries)),
cmap='tab10',
alpha=0.6,
edgecolors='black',
)
for i, country in enumerate(countries):
plt.annotate(country, (gdp[i], growth[i]),
textcoords="offset points", xytext=(10, 5), fontsize=9)
plt.xlabel('PIB (Billions USD)')
plt.ylabel('Taux de Croissance du PIB (%)')
plt.title('PIB vs Taux de Croissance (taille des bulles = population)')
plt.show()Ajouter une Ligne de Régression
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(42)
x = np.random.randn(100) * 3
y = 1.5 * x + np.random.randn(100) * 2
# Ajuster la régression linéaire
coefficients = np.polyfit(x, y, 1)
poly = np.poly1d(coefficients)
x_line = np.linspace(x.min(), x.max(), 100)
plt.figure(figsize=(8, 6))
plt.scatter(x, y, alpha=0.6, s=40, label='Données')
plt.plot(x_line, poly(x_line), 'r-', linewidth=2,
label=f'y = {coefficients[0]:.2f}x + {coefficients[1]:.2f}')
plt.xlabel('X')
plt.ylabel('Y')
plt.title('Nuage de Points avec Ligne de Régression')
plt.legend()
plt.show()Gestion des Points Superposés
Lorsque les points se chevauchent fortement, utilisez la transparence, des marqueurs plus petits ou des techniques basées sur la densité :
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(42)
x = np.random.randn(5000)
y = np.random.randn(5000)
fig, axes = plt.subplots(1, 3, figsize=(15, 5))
# Méthode 1 : Transparence
axes[0].scatter(x, y, alpha=0.1, s=10)
axes[0].set_title('Transparence Alpha')
# Méthode 2 : Petits marqueurs
axes[1].scatter(x, y, s=1, c='black')
axes[1].set_title('Petits Marqueurs')
# Méthode 3 : Histogramme 2D (hexbin)
axes[2].hexbin(x, y, gridsize=30, cmap='YlOrRd')
axes[2].set_title('Densité Hexbin')
plt.tight_layout()
plt.show()Sous-graphiques Multiples
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(42)
n = 100
fig, axes = plt.subplots(2, 2, figsize=(10, 10))
# Graphique 1 : Linéaire
x1 = np.random.randn(n)
axes[0, 0].scatter(x1, 2 * x1 + np.random.randn(n) * 0.5, c='steelblue', s=30)
axes[0, 0].set_title('Relation Linéaire')
# Graphique 2 : Quadratique
x2 = np.linspace(-3, 3, n)
axes[0, 1].scatter(x2, x2**2 + np.random.randn(n) * 0.5, c='coral', s=30)
axes[0, 1].set_title('Relation Quadratique')
# Graphique 3 : Clusters
for i, c in enumerate(['red', 'blue', 'green']):
cx = np.random.randn(30) + i * 3
cy = np.random.randn(30) + i * 2
axes[1, 0].scatter(cx, cy, c=c, s=30, alpha=0.7)
axes[1, 0].set_title('Données Regroupées')
# Graphique 4 : Aucune corrélation
axes[1, 1].scatter(np.random.randn(n), np.random.randn(n), c='purple', s=30, alpha=0.5)
axes[1, 1].set_title('Aucune Corrélation')
plt.tight_layout()
plt.show()Nuages de Points Interactifs avec PyGWalker
Pour l'analyse exploratoire des données, les nuages de points statiques ne sont que le point de départ. PyGWalker (opens in a new tab) transforme votre DataFrame pandas en une interface interactive de type Tableau directement dans Jupyter. Vous pouvez glisser des colonnes sur les axes, ajouter des encodages de couleur et de taille, et filtrer les données -- le tout sans écrire de code supplémentaire :
import pandas as pd
import pygwalker as pyg
df = pd.DataFrame({'x': x, 'y': y, 'category': np.random.choice(['A', 'B', 'C'], len(x))})
walker = pyg.walk(df)Référence des Paramètres de plt.scatter()
| Paramètre | Type | Description |
|---|---|---|
x, y | type tableau | Positions des données |
s | scalaire ou tableau | Taille(s) de marqueur en points^2 |
c | couleur ou tableau | Couleur(s) de marqueur. Tableau pour palette |
marker | str | Style de marqueur ('o', 's', '^', etc.) |
cmap | str ou Colormap | Palette de couleurs quand c est numérique |
alpha | float (0-1) | Transparence |
edgecolors | couleur | Couleur du bord du marqueur |
linewidths | float | Largeur du bord du marqueur |
vmin, vmax | float | Limites de la plage de la palette |
label | str | Étiquette de légende |
FAQ
Comment créer un nuage de points dans Matplotlib ?
Utilisez plt.scatter(x, y) où x et y sont des tableaux de même longueur. Ajoutez plt.xlabel(), plt.ylabel() et plt.title() pour les étiquettes. Appelez plt.show() pour afficher le graphique.
Comment colorer les points d'un nuage de points par catégorie ?
Itérez sur les catégories et appelez plt.scatter() pour chacune avec un paramètre c différent et un label. Puis appelez plt.legend() pour afficher la légende. Alternativement, passez un tableau numérique à c avec une palette de couleurs pour un coloriage continu.
Comment ajouter une ligne de tendance à un nuage de points ?
Utilisez np.polyfit(x, y, degré) pour ajuster un polynôme, créez un np.poly1d() à partir des coefficients et tracez-le avec plt.plot(). Pour degré=1, cela donne une ligne de régression linéaire.
Quelle est la différence entre plt.scatter() et plt.plot() ?
plt.scatter() crée des marqueurs individuels avec un contrôle point par point sur la taille, la couleur et la forme. plt.plot() avec un style de marqueur crée des points connectés avec une apparence uniforme. Utilisez scatter() quand les points nécessitent un style individuel ; utilisez plot() pour les graphiques linéaires ou les marqueurs uniformes.
Comment gérer les points superposés dans un nuage de points ?
Utilisez alpha (transparence) pour révéler la densité, réduisez la taille s des marqueurs, utilisez plt.hexbin() pour les cartes de chaleur de densité, ou décalez légèrement les points avec de petits décalages aléatoires.
Conclusion
Le plt.scatter() de Matplotlib est l'outil standard pour créer des nuages de points en Python. Pour l'exploration basique, un simple plt.scatter(x, y) suffit. Pour des figures de qualité publication, exploitez le mappage de couleurs pour les catégories, l'encodage de taille pour une troisième variable, les lignes de régression pour les tendances et la transparence pour les données denses. Maîtrisez ces techniques et vous pourrez visualiser efficacement toute relation bivariée.