Diagrammes en barres

en langage python

L'essentiel de cette page

Réaliser des diagrammes en barres sous python, c'est aisé avec le module matplotlib.pyplot.

Toutefois, si on veut regroupées, ou cumulées de barres, il faudra faire quelques traitement subtiles ou faire appel à la fonction plot du module pandas.plotting.


1- Tracer un diagramme en barre (ou diagramme en bâtons) en python

  • Installer le module matplotlib (gestion des graphiques sous R) en collant le code suivant dans la console Windows

python -m pip install --user numpy

  • Puis coller le code suivant dans la console python

import matplotlib.pyplot as plt

names = ['A', 'B', 'C'] # nom des barres

values = [1, 10, 100]

plt.bar(names, values) ; plt.show() # Tracer

plt.bar() est donc l'équivalent de la fonction barplot() de R.

2- Ajouter des barres d'erreur à un diagramme en barres

names = ['Mammifères', 'Reptiles', 'Poissons']

values = [6, 20, 3]

ic = [0.5,0.7,0.5]

plt.bar(names, values, color = "#A0AAE4", edgecolor="red",

linewidth=3,

yerr=ic, ecolor = "green",capsize = 10) ; plt.show()

  • edgecolor : couleur de la bordure des barres

  • linewidth : épaisseur de la bordure des barres

  • ecolor : couleur des barres d'erreur

  • capsize : longueur du trait horizontal des barres d'erreur

Ajouter des barres d'erreur avec la fonction bar de matplotlib.pyplot. Cet ajout est limité dans la mise en forme.

  • Ajouter des barres d'erreur avec la fonction errorbar de matplotlib.pyplot sous python

names = ['Mammifères', 'Reptiles', 'Poissons']

values = [6, 20, 3]

ic = [0.5,0.7,0.5]

plt.bar(names, values,color="orange")

plt.errorbar(range(len(values)), values, yerr= ic,

ecolor = "black",capsize = 10,elinewidth = 5,capthick = 5,

fmt="none")

plt.show()

  • elinewidth : épaisseur des barres d'erreur

  • capthick : épaisseur du trait horizontal des barres d'erreur

  • fmt :"none" pour ne pas relier les barres

  • Pour aller plus loin : lien externe.

3- Diagramme en barres à barres cumulées

import matplotlib.pyplt as plt

largeur_barre = 0.8

y1 = [2,8,9,7]

y2 = [5,9,4,2]

x = range(len(y1)) # position en abscisse des barres

# Tracé

plt.bar(x, y1, width = largeur_barre, color = "#3ED8C9")

plt.bar(x, y2, width = largeur_barre, bottom = y1, color = "#EDFF91")

plt.xticks(range(len(y1)), ['A', 'B', 'C', 'D']) ; plt.show()

Les couleurs de ces barres ont été éditées en code couleur html : suivre ce lien pour choisir votre couleur personnalisée.

4- Diagramme en barres à barres regroupées

  • Méthode de base : seulement 2 catégories de barres

largeur_barre = 0.3 # Largeur de chaque barre :

# attention si valeur trop grande, il n'y aura pas de différence entre chaque paquet de barres

y1 = [1, 2, 5]

y2 = [1, 6, 4]

x1 = range(len(y1)) # Position des barres de la catégorie 1

x2 = [i + largeur_barre for i in x1] # Position des barres de la cat 2

import matplotlib.pyplt as plt

plt.bar(x1, y1, width = largeur_barre, color = 'orange', # Barres cat 1

edgecolor = 'black', linewidth = 2)

plt.bar(x2, y2, width = largeur_barre, color = 'yellow', # Barres cat 2

edgecolor = ['black' for i in y1], linewidth = 2)

plt.xticks([r + largeur_barre / 2 for r in range(len(y1))], # Etiquettes

['Qualité', 'Environnement', 'Social'])

plt.show()

Avec pandas (méthode la plus simple)

import pandas as pd

import seaborn as sns

import matplotlib.pyplot as plt

tips = sns.load_dataset("tips")

pd.crosstab(tips.sex,tips.smoker).plot(kind="bar") ; plt.show()

  • Méthode simple : convertir les données à afficher en diagramme en barres en dataframe de type pandas : mise en en forme ainsi automatique. Nécessite le module pandas.

Sans_engrais = [13,15,10]

Avec_engrais = [14,10,11]

import pandas as pd

mydata = pd.DataFrame({"Sans engrais":Sans_engrais,"Avec engrais":Avec_engrais})

mydata.index = ["A","B","C"]

from pandas import plotting

mydata.plot(kind="bar",rot=30) # Cette fonction fabrique automatiquement un diagramme à barres regroupées à partir d'une dataframe (rot : orientation des étiquettes)

plt.show()

  • Méthode de base améliorée : on peut ajouter autant de catégories que désiré (+ tracé d'une légende)

Categories = ["Echantillon 1","Echantillon 2","Echantillon 3"] # 3 échantillons

Sous_categories = ['Qualité', 'Environnement', 'Social','Bien-être'] # comparés selon 4 critères

# Valeurs pour chaque catégories

y1 = [1, 2, 5, 2] ; y2 = [1, 6, 4, 2] ; y3 = [1, 6, 4, 2]

from math import *

nb_categories = len(Categories)

largeur_barre = floor(1*10/nb_categories)/10

x1 = range(len(y1))

x2 = [i + largeur_barre for i in x1]

x3 = [i + 2*largeur_barre for i in x1]

import matplotlib.pyplt as plt

plt.bar(x1, y1, width = largeur_barre, color = 'red',

edgecolor = 'black', linewidth = 2)

plt.bar(x2, y2, width = largeur_barre, color = 'blue',

edgecolor = 'black', linewidth = 2)

plt.bar(x3, y3, width = largeur_barre, color = 'green',

edgecolor = 'black', linewidth = 2)

plt.xticks([r + largeur_barre / nb_categories for r in range(len(y1))],

Sous_categories)

plt.legend(Categories,loc=2)

plt.show()