Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

Matplotlib

1. Tracer votre premier graphique

D’abord, nous devons importer la bibliothèque matplotlib.

import matplotlib

Maintenant, traçons notre premier graphique ! :)

import random
import matplotlib.pyplot as plt
random_numbers = [random.randint(1, 14) for _ in range(10)]
plt.plot(random_numbers)
plt.show()
<Figure size 640x480 with 1 Axes>

Dans un notebook Jupyter comme celui-ci, le graphique s’affiche tout seul juste en dessous de la cellule de code. Avant, il fallait taper %matplotlib inline, mais maintenant, c’est automatique. C’est super pratique !

Si tu donnes juste une liste de nombres à plot, il s’en sert pour l’axe vertical (Y). Pour l’axe horizontal (X), il prend juste la position de chaque nombre dans la liste (0, 1, 2...).

Tu peux aussi donner deux listes : la première pour les points sur l’axe X, la deuxième pour les points sur l’axe Y.

x = [5, 4, 2, 3, 0]
y = [2, 3, 1, 5, 4]
plt.plot(x, y)
plt.show()
<Figure size 640x480 with 1 Axes>

Les axes s’ajustent tout seuls. Si tu veux un peu plus d’espace, tu peux définir toi-même les limites des axes avec plt.axis([min_x, max_x, min_y, max_y]).

plt.plot(x, y)
plt.axis([-7, 7, 1, 11])
plt.show()
<Figure size 640x480 with 1 Axes>

Maintenant, dessinons une fonction mathématique. On va créer 100 points pour x entre -3 et 3, puis on calcule y comme étant le carré de x.

import numpy as np
x = np.linspace(-3, 3, 100)
y = x**2

plt.plot(x, y)
plt.xlabel("x")
plt.ylabel("y = x^2")
plt.title("Plot of y = x^2")
plt.show()
<Figure size 640x480 with 1 Axes>
x_filtered = x[x >= 0]
y = np.sqrt(x_filtered)

plt.plot(x_filtered, y)
plt.xlabel("x")
plt.ylabel("y = sqrt(x)")
plt.title("Plot of y = sqrt(x)")
plt.show()
<Figure size 640x480 with 1 Axes>
x = np.linspace(-1, 5, 100)
y = np.sin(x)

plt.plot(x, y)
plt.xlabel("x")
plt.ylabel("y = sin(x)")
plt.title("Plot of y = sin(x)")
plt.show()
<Figure size 640x480 with 1 Axes>
x = np.linspace(-1, 5, 100)
y = np.cos(x)

plt.plot(x, y)
plt.xlabel("x")
plt.ylabel("y = cos(x)")
plt.title("Plot of y = cos(x)")
plt.show()
<Figure size 640x480 with 1 Axes>

2. Changer le style et la couleur

Par défaut, la ligne est bleue et continue. Tu peux facilement changer ça. Par exemple, pour une ligne bleue en tirets, tu peux le spécifier.

plt.plot(x, y, 'y--')
plt.xlabel("x")
plt.ylabel("y = cos(x)")
plt.title("Plot of y = cos(x) (yellow, dashed)")
plt.show()
<Figure size 640x480 with 1 Axes>
plt.plot(x, y, color='red', linestyle='--')
plt.title("Le graphique de la fonction Cosinus")
plt.xlabel("Axe des x")
plt.ylabel("Axe des y = cos(x) (yellow, tirets)")
plt.grid(True)
plt.show()
<Figure size 640x480 with 1 Axes>

Tu peux même dessiner plusieurs courbes sur le même graphique. Il suffit d’appeler plot plusieurs fois.

x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)

plt.plot(x, y1, label='sin(x)')
plt.plot(x, y2, label='cos(x)')

plt.xlabel("x")
plt.ylabel("y")
plt.title("Graphique de sin(x) et cos(x)")
plt.legend()
plt.grid(True)
plt.show()
<Figure size 640x480 with 1 Axes>

Pour dessiner plusieurs courbes sur le même graphique, il suffit d’appeler la fonction plt.plot() pour chaque courbe que vous souhaitez ajouter, avant d’appeler plt.show().

Dans l’exemple ci-dessus :

  • Nous créons 100 points pour x entre 0 et 10.

  • Nous calculons les valeurs y pour sin(x) et cos(x).

  • Le premier plt.plot(x, y1, label='sin(x)') trace la courbe du sinus.

  • Le deuxième plt.plot(x, y2, label='cos(x)') trace la courbe du cosinus sur le même graphique.

  • Nous ajoutons des étiquettes d’axe, un titre et une légende (plt.legend()) pour identifier chaque courbe plus facilement.

  • Enfin, plt.show() affiche le graphique avec les deux courbes.

3. Enregistrer ton graphique

Pour garder ton graphique comme une image (par exemple, un fichier PNG), utilise plt.savefig().

x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)

plt.plot(x, y1, label='sin(x)')
plt.plot(x, y2, label='cos(x)')

plt.xlabel("x")
plt.ylabel("y")
plt.title("Graphique de sin(x) et cos(x)")
plt.legend()
plt.grid(True)
plt.show()
plt.savefig("sin_cos.png")
print("Le graphique a été enregistré sous le nom de sin_cos.png")
<Figure size 640x480 with 1 Axes>
Le graphique a été enregistré sous le nom de mon_graphique.png
<Figure size 640x480 with 0 Axes>

4. Plusieurs graphiques côte à côte

Créer une figure et des sous-graphiques

Subtask:

Utiliser plt.figure() pour créer une nouvelle figure et fig.add_subplot() ou plt.subplot() pour ajouter un ou plusieurs sous-graphiques à la figure.

Tracer sur chaque sous-graphique

Subtask:

Pour chaque sous-graphique, utiliser ses propres méthodes de traçage (par exemple, ax.plot()) pour ajouter les données souhaitées.

x = np.linspace(0, 10, 500)
y1 = np.sin(x)
y2 = np.cos(x)

# Tracer sin et cos sur des sous-graphiques
fig, axes = plt.subplots(1, 2, figsize=(10, 4))

# Tracer sin(x) sur le premier sous-graphique
axes[0].plot(x, y1, label='sin(x)', color='blue')
axes[0].set_xlabel("x")
axes[0].set_ylabel("y")
axes[0].set_title("Graphique de sin(x)")
axes[0].grid(True)
axes[0].legend()

# Tracer cos(x) sur le deuxième sous-graphique
axes[1].plot(x, y2, label='cos(x)', color='red')
axes[1].set_xlabel("x")
axes[1].set_ylabel("y")
axes[1].set_title("Graphique de cos(x)")
axes[1].grid(True)
axes[1].legend()

# Ajuster l'espacement entre les sous-graphiques
plt.tight_layout()
plt.show()
<Figure size 1000x400 with 2 Axes>
x = np.linspace(-2, 2, 500)
y = y1
y2 = y2

fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(10, 4))

ax1.plot(x, y, color='blue', linestyle='--')
ax1.set_title('Fonction sinn(x)')
ax1.grid(True)

ax2.plot(x, y2, color='green', linestyle='-')
ax2.set_title('Fonction cos(x)')
ax2.grid(True)

plt.show()
<Figure size 1000x400 with 2 Axes>

5. Plusieurs fenêtres de graphiques

Tu peux aussi créer des graphiques dans des fenêtres complètement différentes.

fig1 = plt.figure()
plt.plot(x, y, color='blue')
plt.title('Fonction sin(x)')
plt.grid(True)

fig2 = plt.figure()
plt.plot(x, y2, color='green')
plt.title('Fonction cos(x)')
plt.grid(True)

plt.show()
<Figure size 640x480 with 1 Axes>
<Figure size 640x480 with 1 Axes>

6. Deux façons de coder : simple ou complète

Jusqu’à maintenant, on a utilisé pyplot directement. C’est facile, mais pour des graphiques complexes, il vaut mieux utiliser une autre approche, plus claire, appelée “orientée objet”.

x = np.linspace(0, 5, 100)

# La façon simple (implicite)
plt.plot(x, np.sin(x))
plt.plot(x, np.cos(x))
plt.show()
<Figure size 640x480 with 1 Axes>
x = np.linspace(0, 5, 100)

# La façon plus claire (explicite)
# On crée une figure (fig) et un graphique (ax)
fig, ax = plt.subplots()
# Et on dit à notre graphique "ax" de dessiner
ax.plot(x, np.sin(x))
ax.plot(x, np.cos(x))
plt.show()
<Figure size 640x480 with 1 Axes>

7. Quelle est la différence entre Pyplot et Matplotlib ?

  • Matplotlib : C’est le nom de toute la boîte à outils pour dessiner.

  • Pyplot : C’est une partie de Matplotlib qui rend la création de graphiques super simple. C’est ce qu’on a beaucoup utilisé.

8. Ajouter du texte sur le graphique

Tu peux écrire ce que tu veux, où tu veux sur ton dessin.

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0, 2.5, 50)
px = 0.8
py = np.sqrt(px)

fig, ax = plt.subplots()

# On dessine la courbe et un point rouge
ax.plot(x, np.sqrt(x), "y--", px, py, "ro")

# On ajoute du texte. On peut même utiliser une notation mathématique !
ax.text(0.5, 1.2, "Équation : $y = \sqrt{x}$", fontsize=15, ha="center")
ax.text(px + 0.1, py - 0.1, "un point important", ha="left")
ax.grid(True)
ax.set_xlabel("x")
ax.set_ylabel("y")
ax.set_title("Plot of y = sqrt(x)")
plt.show()
<Figure size 640x480 with 1 Axes>

9. Mettre une légende

La légende, c’est la petite boîte qui explique à quoi correspond chaque ligne de ton graphique.

x = np.linspace(0, 10, 100) # Création de 100 points pour x entre 0 et 10

# La façon plus claire (explicite)
# On crée une figure (fig) et un graphique (ax)
fig, ax = plt.subplots()
# Et on dit à notre graphique "ax" de dessiner
# On donne un "label" (une étiquette) à chaque courbe en français
ax.plot(x, np.sin(x), label='sinus')
ax.plot(x, np.cos(x), label='cosinus')
# La fonction legend() affiche la boîte avec les étiquettes
ax.legend()
plt.show()
<Figure size 640x480 with 1 Axes>

10. Changer l’échelle des axes

Parfois, les chiffres grandissent très vite. Une échelle “logarithmique” peut aider à mieux voir ce qu’il se passe.

x = np.linspace(0.1, 15, 500)
y = np.sin(x)

fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(10, 4))

# À gauche, l'échelle normale
ax1.plot(x, y)
ax1.set_title('Échelle normale')
ax1.grid(True)

# À droite, l'échelle spéciale (logarithmique sur l'axe Y)
ax2.semilogy(x, y)
ax2.set_title('Échelle spéciale (log)')
ax2.grid(True, which="both")
plt.show()
<Figure size 1000x400 with 2 Axes>

11. Personnaliser les graduations

Tu peux changer les petites barres et les chiffres sur les axes pour mettre ce que tu veux.

x = np.linspace(-2, 2, 100)

fig, ax = plt.subplots()
ax.plot(x, np.cos(x)) # Tracer la fonction cosinus
# On choisit où mettre les barres...
ax.set_xticks([-2, -1, 0, 1, 2])
# ...et on écrit le texte qu'on veut à la place des chiffres.
ax.set_xticklabels(['moins deux', 'moins un', 'zéro', 'un', 'deux'])
plt.show()
<Figure size 640x480 with 1 Axes>

12. Graphiques en cercle (polaires)

Pour des données qui tournent en rond, comme une horloge, les graphiques polaires sont parfaits.

# Créer des points pour l'angle theta sur un tour complet (0 à 2*pi)
theta = np.linspace(0, 2 * np.pi, 400) # Augmenter les points pour des pétales plus lisses

# Créer une nouvelle figure
fig = plt.figure()
# Ajouter un sous-graphique polaire à la figure
ax = fig.add_subplot(111, projection='polar') # On dit qu'on veut un graphique polaire

# Tracer 5 formes de fleurs différentes en variant le nombre de pétales
ax.plot(theta, np.cos(2 * theta), color='r', label='2 pétales') # Fleur à 2 pétales (cosinus)
ax.plot(theta, np.sin(3 * theta), color='g', label='3 pétales') # Fleur à 3 pétales (sinus)
ax.plot(theta, np.cos(4 * theta), color='b', label='4 pétales') # Fleur à 4 pétales (cosinus)
ax.plot(theta, np.sin(5 * theta), color='purple', label='5 pétales') # Fleur à 5 pétales (sinus)
ax.plot(theta, np.cos(6 * theta), color='orange', label='6 pétales') # Fleur à 6 pétales (cosinus)


# Ajouter un titre au graphique
plt.title("Graphique Polaire - Plusieurs Formes de Fleurs") # Ajouter un titre
# Ajouter une grille pour une meilleure lisibilité
ax.grid(True) # Ajouter une grille
# Ajouter une légende pour identifier chaque fleur (placée à l'extérieur en bas à gauche)
ax.legend(loc='lower left', bbox_to_anchor=(1, 0.5)) # Ajouter une légende à l'extérieur du graphique

# Ajuster les limites radiales si nécessaire pour s'assurer que les pétales sont entièrement visibles
ax.set_rlim(-1, 1)

# Afficher le graphique
plt.show()
<Figure size 640x480 with 1 Axes>

13. Graphiques en 3D

Oui, tu peux même faire des dessins en trois dimensions !

from mpl_toolkits.mplot3d import Axes3D

# On prépare une grille de points en 3D
x = np.linspace(-5, 5, 50)
y = np.linspace(-5, 5, 50)
X, Y = np.meshgrid(x, y)
R = np.sqrt(X**2 + Y**2)

# Calculer Z pour une forme différente (par exemple, un sombrero)
Z = np.sin(R) / R # Sombrero function

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d') # On active la 3D
ax.plot_surface(X, Y, Z, cmap='viridis') # On dessine une surface

ax.set_title("Graphique 3D - Forme Sombrero")
ax.set_xlabel("X")
ax.set_ylabel("Y")
ax.set_zlabel("Z")

plt.show()
<Figure size 640x480 with 1 Axes>

14. Nuages de points

C’est super utile pour voir si deux séries de chiffres ont un lien entre elles. Chaque point représente une paire de données.

# Créer des données pour un nuage de points différent (par exemple, une spirale)
theta = np.linspace(0, 2 * np.pi, 100) # Angle de 0 à 2*pi
r = theta # Rayon qui augmente avec l'angle

# Convertir les coordonnées polaires (r, theta) en coordonnées cartésiennes (x, y)
x = r * np.cos(theta)
y = r * np.sin(theta)

# Ajouter un peu de bruit pour rendre le nuage plus "nuageux"
noise_x = np.random.randn(100) * 0.5
noise_y = np.random.randn(100) * 0.5
x = x + noise_x
y = y + noise_y

# Créer des couleurs et des tailles aléatoires pour les points
colors = np.random.rand(100)
area = (20 * np.random.rand(100))**2

# Dessiner le nuage de points
plt.scatter(x, y, s=area, c=colors, alpha=0.7) # s: taille, c: couleur, alpha: transparence

# Ajouter des titres et étiquettes en français
plt.title("Nuage de points en forme de spirale (avec bruit)")
plt.xlabel("Axe des x")
plt.ylabel("Axe des y")

plt.show()
<Figure size 640x480 with 1 Axes>

15. Différents types de lignes

Tu n’es pas obligé(e) de faire des lignes toutes simples. Tu peux utiliser des tirets, des points...

x = np.linspace(0, 10, 100)

plt.plot(x, np.sin(x), linestyle='-')  # Ligne normale
plt.plot(x, np.sin(x - 1), linestyle='--') # Tirets
plt.plot(x, np.sin(x - 2), linestyle='-.') # Tirets et points
plt.plot(x, np.sin(x - 3), linestyle=':')  # Petits points
plt.show()
<Figure size 640x480 with 1 Axes>

16. Histogrammes

Un histogramme te montre comment tes données sont réparties. C’est comme trier tes chiffres dans des boîtes pour voir où il y en a le plus.

# On génère 1000 nombres aléatoires
data = np.random.randn(1000)
# On crée l'histogramme avec 30 "boîtes" (bins)
plt.hist(data, bins=30)
plt.show()
<Figure size 640x480 with 1 Axes>

17. Afficher des images

Matplotlib peut aussi tout simplement afficher des images.

from sklearn.datasets import load_sample_images

# On charge des images d'exemple
china = load_sample_images().images[0]
flower = load_sample_images().images[1]

fig, (ax1, ax2) = plt.subplots(1, 2)
ax1.imshow(china)
ax2.imshow(flower)
plt.show()
<Figure size 640x480 with 2 Axes>

18. Animations

Tu peux créer de petites vidéos pour montrer comment un graphique évolue.

from matplotlib.animation import FuncAnimation

fig, ax = plt.subplots()
line, = ax.plot([], [], 'b--')
ax.set_xlim(0, 2)
ax.set_ylim(-1.1, 1.1)

# Cette fonction dessine chaque image de l'animation
def animate(i):
    x = np.linspace(0, 2, 1000)
    y = np.cos(2 * np.pi * (x - 0.01 * i))
    line.set_data(x, y)
    return line,

# On lance l'animation
ani = FuncAnimation(fig, animate, frames=200, interval=20, blit=True)

plt.show()
<Figure size 640x480 with 1 Axes>

19. Enregistrer une animation en vidéo

Pour sauvegarder ton animation dans un fichier (comme un .mp4), tu auras besoin d’un outil comme FFmpeg.

from matplotlib import animation

# Note : Il faut avoir installé FFmpeg pour que ça marche.
Writer = animation.writers['ffmpeg']
writer = Writer(fps=15, metadata=dict(artist='Moi'), bitrate=1800)

# On enregistre l'animation créée juste avant
ani.save('mon_animation.mp4', writer=writer)