Affichage simultané de multiples graphiques et courbes¶

MatPlotLib permet d'afficher plusieurs informations simultanément. Plusieurs alternatives vous sont proposées :

  • Afficher plusieurs courbes sur une même graphique avec des échelles différentes en ordonnées (utilisation de plusieurs systèmes d'axes).
  • Afficher plusieurs graphiques dans des fenêtres distinctes.
  • Afficher plusieurs graphiques les uns à coté des autres au sein d'une même fenêtre.

Reprenons ces possibilités une à une.

Afficher plusieurs courbes sur un même graphique avec échelles différentes¶

L'une des fonctionnalités puissantes de Matplotlib est sa capacité à afficher plusieurs courbes avec des échelles différentes en ordonnées. Cette technique permet de comparer et de mettre en relation des données ayant des échelles différentes, ce qui facilite l'exploration et l'analyse des tendances, des corrélations ou des disparités entre les différentes séries de données.

Lorsque vous travaillez avec des ensembles de données hétérogènes, où les valeurs varient significativement en termes de magnitude ou d'unités, il peut être difficile d'obtenir une visualisation claire et informative en utilisant une seule échelle. En utilisant plusieurs systèmes d'axes dans un même graphique, Matplotlib offre une solution permettant de représenter ces données avec des échelles adaptées à chaque série.

Voici un exemple simple affichant des courbes pour deux fonctions mathématiques classique : une fonction Sinus et une fonction carré. Dans cet exemple, les différents systèmes d'axes ne sont pas encore configurés. Il en découle une difficulté certaine à interpréter la courbe sinus.

In [1]:
import numpy as np
import matplotlib.pyplot as plt

# On calcule les données pour nos deux courbes.
x = np.linspace(-10, 10, 1000)
y1 = x ** 2
y2 = np.sin(x)

# On trace nos deux courbes.
plt.plot(x, y1, "b", label="Fonction carré")
plt.plot(x, y2, "r", label="Fonction sinus")
plt.legend()

# On affiche la fenêtre.
plt.show()

Introduisons maintenant un nouveau système d'axes : cela se fait en invoquant la méthode « twinx » à partir du premier système d'axes.

Notez la possibilité d'afficher les labels pour nos ordonnées en couleur : cela permet de mettre en relation l'échelle proposée avec la bonne courbe associée.

In [2]:
import numpy as np
import matplotlib.pyplot as plt

# On calcule les données pour nos deux courbes.
x = np.linspace(-10, 10, 1000)
y1 = x ** 2
y2 = np.sin(x)

# On récupère le système d'axes (ax) et on l'utilise pour tracer la fonction carré.
fig, ax = plt.subplots()
ax.plot(x, y1, "b")
ax.set_xlabel("x values", fontsize=14)
ax.set_ylabel("square values", color="blue", fontsize=14)

# On produit un second système d'axes à partir du premier et on l'utilise pour tracer la fonction sinus.
ax2 = ax.twinx()
ax2.plot(x, y2, "r")
ax2.set_ylabel("sinus", color="red", fontsize=14)

# On prépare la légende pour nos deux courbes.
lines = [ax.get_lines()[0], ax2.get_lines()[0]]
plt.legend(lines, ["Fonction carrée", "Fonction sinus"], loc="upper center")

# Et on affiche le tout.
plt.show()

Afficher plusieurs graphiques dans des fenêtres distinctes¶

Afficher plusieurs graphiques dans des fenêtres distinctes est une approche courante pour visualiser différentes informations graphiques simultanément. Cette technique vous permet de créer des fenêtres séparées pour chaque graphique, offrant ainsi une vue détaillée et ciblée sur chaque visualisation.

En utilisant Matplotlib, vous pouvez facilement créer plusieurs fenêtres de graphiques en utilisant la fonction plt.figure() pour chaque graphique. Chaque fenêtre de graphique peut être personnalisée individuellement avec des axes, des titres, des étiquettes et des styles spécifiques.

Voici un exemple illustrant cette technique : bien entendu un backend Qt est requis pour cette démonstration.

In [3]:
%matplotlib qt

import numpy as np
import matplotlib.pyplot as plt

# On calcule les données pour nos deux courbes.
x = np.linspace(-10, 10, 1000)
y1 = x ** 2
y2 = np.sin(x)

# On trace notre première courbe dans une première figure (fenêtre graphique).
plt.figure("Fonction Carrée")
plt.plot(x, y1, "b")

# On trace notre seconde courbe dans une second figure (fenêtre graphique).
plt.figure("Fonction Sinus")
plt.plot(x, y2, "r")

# On affiche nos deux figures : attention, les fenêtres peuvent être l'une sur l'autre !
plt.show()

image.png

In [4]:
%matplotlib inline

Afficher plusieurs graphiques les uns à coté des autres au sein d'une même fenêtre¶

Afficher plusieurs graphiques les uns à côté des autres au sein d'une même fenêtre est une technique utile pour comparer visuellement différents graphiques et repérer les tendances, les relations ou les différences entre les données. Cette approche vous permet de regrouper plusieurs visualisations dans une seule fenêtre, offrant une vue globale et comparative des informations.

Matplotlib fournit des fonctionnalités pour créer des mises en page de graphiques personnalisées en utilisant la fonction subplot() pour organiser les graphiques dans une grille. Voici la signature de la fonction subplot :

plt.subplot(nrows, ncols, index, **kwargs)

ou

  • nrows spécifie le nombre de lignes dans la grille de subplots.
  • ncols spécifie le nombre de colonnes dans la grille de subplots.
  • index spécifie l'index du subplot courant dans la grille (l'index est basé à partir de 1).

Voici un exemple illustrant cette technique : ce code génère et affiche des signaux sinusoïdaux avec différentes fréquences, ainsi qu'un signal résultant qui est la somme de ces signaux. Cela permet de visualiser et de comparer les différentes fréquences des signaux dans des sous-graphiques distincts.

In [5]:
import numpy as np
import matplotlib.pyplot as plt

# Trois signaux avec trois fréquences différentes
x = np.linspace(0, 1, 1000)
y1 = np.sin(x * (20*np.pi))             # 10 hz
y2 = np.sin(x * (50*np.pi))             # 25 hz
y3 = np.sin(x * (100*np.pi))            # 50 hz

# Génération du signal multi-fréquences
y = y1 + y2 + y3

# Nous allons considérer une grille de quatre lignes et d'une seule colonne.
# Première ligne
plt.subplot(4, 1, 1)
plt.plot(x, y1, c="r", label="10 Hz")
plt.legend(loc="center right")

# Seconde ligne
plt.subplot(4, 1, 2)
plt.plot(x, y2, c="g", label="25 Hz")
plt.legend(loc="center right")

# Troisième ligne
plt.subplot(4, 1, 3)
plt.plot(x, y3, c="b", label="50 Hz")
plt.legend(loc="center right")

# Dernière ligne
plt.subplot(4, 1, 4)
plt.plot(x, y, label="Signal à traiter")
plt.legend(loc="center right")

# Fignolage et affichage
plt.tight_layout()      # Sans cette ligne, il y a des chevauchements dans les étiquettes
plt.show()