Un histogramme est un type de graphique qui permet de visualiser la répartition d'une variable quantitative continue en la représentant sous forme de colonnes verticales. Chaque colonne représente une plage de valeurs de la variable, appelée bin ou classe, et sa hauteur représente le nombre d'observations qui se trouvent dans cette plage.
Matplotlib propose la fonction hist pour tracer des histogrammes. Cette fonction prend en entrée une liste de données et un nombre de bins, qui représente le nombre de classes dans lesquelles les données doivent être regroupées.
Voici un exemple de code pour tracer un histogramme avec Matplotlib :
import numpy as np
import matplotlib.pyplot as plt
# On décore un peu le graphique
plt.title("Exemple basique d'utilisation d'un histogramme")
plt.xlabel("Valeurs")
plt.ylabel("Quantités")
# On trace l'histogramme
x = [1, 2, 2, 3, 4, 4, 4, 4, 4, 5, 5]
plt.hist(x, bins=5)
# Affichage de la figure
plt.show()
Comme vous le constatez, le visuel est discutable et le fait que les bins se touchent n'est pas très agréable. Retravaillons un peu notre graphique en aérant les choses.
import numpy as np
import matplotlib.pyplot as plt
# On décore un peu le graphique
plt.title("Exemple basique d'utilisation d'un histogramme")
plt.xlabel("Valeurs")
plt.ylabel("Quantités")
# On trace l'histogramme
x = [1, 2, 2, 3, 4, 4, 4, 4, 4, 5, 5]
plt.hist(x, range = (1, 6), bins=5, rwidth=0.5, align="right") # C'est mieux ;-)
# Affichage de la figure
plt.show()
Il est possible de visualiser la répartition des pixels de l'image. C'est d'ailleurs, un exemple typique de traitement d'image avec Matplotlib.
import matplotlib.pyplot as plt
# Chargement de l'image et affichage de ses dimensions
img = plt.imread("Images/bact2.png")
print("Une image PNG est décodée avec des pixels de type", img.dtype, "compris entre 0 et 1")
img = (img * 255).astype(np.uint8) # Nos pixels sont maintenant entre 0 et 255.
print("Après transformation : ", img.dtype, "compris entre 0 et 255")
# Récupération du plan de couleur pour la composante Red
img = img[:, :, 0] # Nous reviendrons sur ce qui se passe ici, quand nous étudierons Numpy
# On divise l'espace disponible en une ligne et deux colonnes.
fig, (ax1, ax2) = plt.subplots(1, 2) # On obtient deux systèmes d'axes dans le tuple.
fig.set_size_inches(12, 4)
# Affichage de l'histogramme pour voir la répartition des pixels
pixels = img.ravel() # On met l'image à plat
ax1.hist(pixels, bins=256)
# Affichage de l'image en niveaux de gris
ax2.imshow(img, cmap="gray")
# Affichage de la figure
plt.show()
Une image PNG est décodée avec des pixels de type float32 compris entre 0 et 1 Après transformation : uint8 compris entre 0 et 255
On observe que les pixels relatifs aux bactéries sont compris entre 25 et 175. Les autres pixels (avant 25) correspondent au fond en noir (ce qui représente la majorité des pixels).
L'exemple suivant vous montre comment coloriser les différents compartiments d'un histogramme en se basant sur une palette de couleurs prédéfinies dans MatPlotLib.
import numpy as np
import matplotlib.pyplot as plt
# On décore un peu le graphique
plt.title("On colorise les différents compartiments de l'histogramme")
plt.xlabel("Valeurs")
plt.ylabel("Quantités")
# On capture une color map.
cm = plt.colormaps['RdYlBu'] # Red -> Yellow -> Blue
# On produit 1000 données aléatoires réparties selon une distribution gaussienne.
data = np.random.randn(1000)
# On trace l'histogramme.
bin_count = 20
n, bins, patches = plt.hist(data, bins=bin_count)
# On colorise chaque patch (chaque compartiment) de l'histogramme.
colors = np.linspace(0, 1, bin_count)
for color, patch in zip(colors, patches):
plt.setp(patch, 'facecolor', cm(color))
# Affichage de la figure.
plt.show()
La librairie MatPlotLib permet aussi de tracer des histogrammes en 2D, via la fonction hist2D
. Voici un exemple d'utilisation.
import numpy as np
import matplotlib.pyplot as plt
# On calcule un jeu de données aléatoires
n = 10000
x = np.random.randn(n)
y = 4.0 * x + 3.0 * np.random.randn(n)
# On dessine l'histogramme en deux dimension avec la palette de couleurs Blues
plt.title("Un exemple d'histogramme en 2D")
plt.hist2d(x, y, cmap="Blues")
# On place la barre de couleurs sur le côté droit.
plt.colorbar()
# On affiche la fenêtre graphique
plt.show()