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
Ajouter directement les barres d'erreur (intervalles de confiance) avec la fonction .bar()
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
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()