Aller au contenu

Histogramme

Les histogrammes se construisent à partir d'une liste de valeurs et des intervalles.

Histogramme simple

import matplotlib.pyplot as plt  # Module pour tracer les graphiques
import numpy as np

# Tableau de 50 valeurs comprises entre 0 et 9
valeurs = np.random.randint(0, 10, 50)
print(valeurs)  # Affichage des valeurs
# Création d'un tableau avec les intervalles centrés sur la valeur entière
inter = [-0.5, 0.5, 1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5, 9.5]

plt.hist(valeurs, bins=inter, rwidth=0.8)  # Création de l'histogramme
plt.xlabel('Valeurs')
plt.xticks(np.arange(0, 10))
plt.ylabel('Nombres')
plt.title("Exemple d'histogramme simple")
plt.show()
1
2
    [9 6 7 1 9 4 7 2 4 9 8 0 4 0 1 9 0 9 2 8 4 3 3 6 2 2 6 6 1 2 5 6 7 8 1 8 7
     6 4 1 7 7 2 2 3 9 9 2 5 8]

png

Personnalisation des intervalles

Pour modifier les intervalles, il est possible d'utiliser plusieurs combinaisons des paramètres range et bins.

Paramètre Détails
bins Si c'est une valeur entière, défini le nombre de parts égal du paramètre range
Si c'est une liste, un tableau ou une séquence, il défini les différents intervalles (valeur de gauche incluse et celle de droite exclue (sauf la dernière)).
Les intervalles peuvent être de largeur inégale.
range Valeurs min et max des intervalles

Exemples d'utilisation :

  • plt.hist(valeurs, range=(0,9), bins=9) : les valeurs sont comprises entre 0 et 9 avec 9 intervalles de taille égale ([0,1[,[1,2[, ...,[8,9]) ;
  • plt.hist(valeurs, range=(0,9)) : identique au précédent ;
  • plt.hist(valeurs, bins=range(10)) : même résultat que précédemment, mais en indiquant explicitement les intervalles ;
  • plt.hist(valeurs, bins=np.linspace(-0.5,9.5,11)) : création des intervalles de manière explicite centrés sur la valeur entière.

Personnalisation de l'histogramme

Les paramètres pour modifier l'apparence de l'histogramme sont disponibles ci-dessous :

Paramètre Détails
density=True Trace les fréquences plutôt que les nombres en ordonnée (somme vaut 1).
weights=[1,2,1] Tableau de même dimension que les valeurs qui attribue un poids à chaque intervalle.
S'applique uniquement si density=True.
cumulative=True On construit l'histogramme du plus petit au plus grand est chaque barre
prend ça valeur plus le cumul des valeurs plus petites (de gauche)
histtype='bar' Défini le type d'histogramme à afficher :
- 'bar' histogramme traditionnel avec des barres ;
- 'barstacked' si on a plusieurs liste de valeurs, elles sont affichées empilées l'une
sur l'autre et pas côte-à-côte ;
- 'step' génère une courbe (contour) à partir de l'histogramme ;
- 'stepfilled' génère une courbe (contour) et la zone entre le 0 et la valeur est coloriée.
align='mid' Alignement de la barre par rapport au centre de l'intervalle : 'left', 'mid'ou 'right'.
orientation='vertical' Orientation des barres : 'horizontal' ou 'vertical'.
rwidth=0.8 Largeur relative de la barre par rapport à l'intervalle (ici 80 %).
log=True Utilise une échelle logarithmique.
color='red' Couleur des barres.
edgecolor='black' Couleur du cadre des barres.
label='Série 1' Nom donné à la série. C'est le nom qui apparaît dans la légende.
stacked=True Si il y a plusieurs séries de données, elles s'affichent empilées et non côte-à-côte.
hatch='/' Hachuer les barres : '/', '\', '|', '-', '+', 'x', 'o', 'O', '.', '*'

Exemple avec 2 séries de valeurs

import matplotlib.pyplot as plt  # Module pour tracer les graphiques
import numpy as np

# Tableau de 50 valeurs comprises entre 0 et 9
valeurs = np.random.randint(0, 10, 50)
# Tableau de 50 valeurs comprises entre 0 et 9
valeurs2 = np.random.randint(0, 10, 50)
# Création d'un tableau avec les intervalles centrés sur la valeur entière
inter = np.linspace(-0.5, 9.5, 11)

plt.hist([valeurs, valeurs2], bins=inter, rwidth=0.8, stacked=True,
         label=['Valeurs 1', 'Valeurs 2'])  # Création de l'histogramme
plt.xlabel('Valeurs')
plt.xticks(np.arange(0, 10))
plt.ylabel('Nombres')
plt.title("Histogramme")
plt.legend()
plt.show()

png

Exemple barres horizontales

import matplotlib.pyplot as plt  # Module pour tracer les graphiques
import numpy as np

# Tableau de 50 valeurs comprises entre 0 et 9
valeurs = np.random.randint(0, 10, 50)
# Création d'un tableau avec les intervalles centrés sur la valeur entière
inter = [-0.5, 0.5, 1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5, 9.5]

plt.hist(valeurs, bins=inter, orientation='horizontal',
         rwidth=0.9)  # Création de l'histogramme
plt.xlabel('Valeurs')
plt.xticks(np.arange(0, 10))
plt.ylabel('Nombres')
plt.title("Histogramme horizontal")
plt.show()

png

Exemple décoration des barres

import matplotlib.pyplot as plt  # Module pour tracer les graphiques
import numpy as np

# Tableau de 50 valeurs comprises entre 0 et 9
valeurs = np.random.randint(0, 10, 50)
# Création d'un tableau avec les intervalles centrés sur la valeur entière
inter = [-0.5, 0.5, 1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5, 9.5]

plt.hist(valeurs, bins=inter, rwidth=0.8, color='orange',
         edgecolor='blue', hatch='/')  # Création de l'histogramme
plt.xlabel('Valeurs')
plt.xticks(np.arange(0, 10))
plt.ylabel('Nombres')
plt.title("Histogramme avec hachures")
plt.show()

png

Histogramme avec étiquettes personnalisées

Pour afficher un histogramme associant une valeur avec une étiquette, il faut passer par la fonction ax.bar(...).

import matplotlib.pyplot as plt  # Module pour tracer les graphiques
import numpy as np

# Préparation de la figure
fig = plt.figure()
ax = fig.add_axes([0, 0, 1, 1])

etiquettes = ['C', 'C++', 'Java', 'Python', 'PHP']
valeurs = [23, 17, 35, 29, 12]

# Affichage des données
ax.bar(etiquettes, valeurs)

plt.title("Histogramme")  # Titre du graphique
plt.ylabel('Valeurs')  # Titre de l'axe y
plt.xlabel('Langages de programmation')
plt.show()  # Affichage d'une courbe

png

Personnalisation de la couleur de chaque barre

Pour personnaliser individuellement chaque couleur, on reprend le paramètre color, mais on lui passe un tableau de couleur qui correspond à chaque étiquette.

import matplotlib.pyplot as plt  # Module pour tracer les graphiques
import numpy as np

# Préparation de la figure
fig = plt.figure()
ax = fig.add_axes([0, 0, 1, 1])

etiquettes = ['C', 'C++', 'Java', 'Python', 'PHP']
valeurs = [23, 17, 35, 29, 12]

# Affichage des données
ax.bar(etiquettes, valeurs, color=[
       'red', 'blue', 'orange', 'green', 'gray'], edgecolor="black")

plt.title("Histogramme")  # Titre du graphique
plt.ylabel('Valeurs')  # Titre de l'axe y
plt.xlabel('Langage de programmation')
plt.show()  # Affichage d'une courbe

png

Autres exemples

# Histogramme avec 2 séries

x1 = [1, 2, 2, 3, 4, 4, 4, 4, 4, 5, 5]
x2 = [1, 1, 1, 2, 2, 3, 3, 3, 3, 4, 5, 5, 5]
bins = [x + 0.5 for x in range(0, 6)]

plt.hist([x1, x2], bins=bins, color=['yellow', 'green'],
         edgecolor='red', hatch='/', label=['x1', 'x2'],
         histtype='bar')  # bar est le defaut
plt.ylabel('Valeurs')
plt.xlabel('Nombres')
plt.title('2 series')
plt.legend()
plt.show()

png

# Histogrammes superposés avec un effet de transparence

x1 = [1, 2, 2, 3, 4, 4, 4, 4, 4, 5, 5]
x2 = [1, 1, 1, 2, 2, 3, 3, 3, 3, 4, 5, 5, 5]
bins = [x + 0.5 for x in range(0, 6)]
plt.hist(x1, bins=bins, color='yellow',
         edgecolor='red', hatch='/', label='x1')
plt.hist(x2, bins=bins, color='green', alpha=0.5,
         edgecolor='blue', hatch='\ ', label='x2')
plt.ylabel('Valeurs')
plt.xlabel('Nombres')
plt.title('Superpose')
plt.legend()
plt.show()

png

# Histogrammes empilés

x1 = [1, 2, 2, 3, 4, 4, 4, 4, 4, 5, 5]
x2 = [1, 1, 1, 2, 2, 3, 3, 3, 3, 4, 5, 5, 5]
bins = [x + 0.5 for x in range(0, 6)]
plt.hist([x1, x2], bins=bins, color=['yellow', 'green'],
         edgecolor='red', hatch='/', label=['x1', 'x2'],
         histtype='barstacked')
plt.ylabel('Valeurs')
plt.xlabel('Nombres')
plt.title('2 series empilées')
plt.legend()
plt.show()

png