7.3 KiB
title, author
title | author |
---|---|
Matplotlib | Steve Kossouho |
Rendu de graphiques Matplotlib
Qu'est-ce que Matplotlib ?
Matplotlib, selon ses créateurs (John D. Hunter et al.), est une bibliothèque complète, pour créer des graphiques statiques, animés ou interactifs 👀.
La bibliothèque rend des choses simples très simples, et des choses compliquées possibles (et accessoirement beaucoup de choses simples compliquées).
Comment fonctionne Matplotlib ?
La bibliothèque permet de dessiner des graphiques, souvent très simplement en assemblant des éléments, par exemple un axe avec une certaine échelle, et une ligne suivant la même échelle.
Les possibilités sont très nombreuses, et les concepts proposés aussi, avec une approche très différente de ce qui se fait normalement en Python; usage de variables globales ou classes complexes pour représenter de simples dégradés de couleurs.
Graphiques avec Pandas
La bibliothèque Matplotlib permet facilement de générer et afficher
des graphiques, mais les objets DataFrame
{.python} proposent un
raccourci pour les générer facilement.
Chaque objet possède une méthode générale .plot()
{.python}, qui possède
des attributs qui sont des méthodes spécifiques pour chaque type
de graphique.
Méthode | Explication succincte |
---|---|
plot.area |
Tracer un graphique en aires empilées |
plot.bar |
Tracer un graphique en barres verticales |
plot.barh |
Tracer un graphique en barres horizontales |
plot.box |
Tracer un graphique à moustaches (boxplot) |
plot.density |
Tracer une estimation de densité de noyau |
plot.hexbin |
Tracer un graphique hexagonal en 2D |
plot.hist |
Tracer un histogramme |
plot.kde |
Tracer une estimation de densité de noyau |
plot.line |
Tracer un graphique en lignes |
plot.pie |
Tracer un graphique en secteurs |
plot.scatter |
Tracer un nuage de points (scatter plot) |
Barres
import pandas as pd
from matplotlib import use, pyplot
# Utiliser tkinter
use("TkAgg")
# Données à afficher
data = pd.DataFrame(data={
"product": ["pomme", "poire", "banane", "pêche"],
"price": [1.99, 2.49, 2.99, 3.49]
})
# Générer un graphique dans Matplotlib
axis = data.plot.bar(x="product", y="price")
# Afficher le dernier graphique généré
pyplot.show()
Notez que les étiquettes des barres, entre autres, débordent de l'image. D'autres défauts généraux sont habituellement rencontrés avec Matplotlib, comme l'absence d'affichage de valeur pour les éléments des graphiques, ou l'absence de gestion du contraste lorsqu'il faut afficher du texte sur des fonds sombres ou clairs.
Personnalisation
De nombreuses options de personnalisation permettent de changer le rendu par défaut des graphiques.
La variable rcParams
{.python} de pyplot
{.python} est un dictionnaire proposant des options
pour changer entre autres la police de texte par défaut ou les styles de ligne.
import matplotlib
import pandas as pd
from matplotlib import pyplot
matplotlib.use("TkAgg")
pyplot.style.use('ggplot')
pyplot.rcParams["font.family"] = "Cabin"
data = pd.DataFrame(data={
"product": ["pomme", "poire", "banane", "pêche"],
"price": [1.99, 2.49, 2.99, 3.49],
"wpu": [200, 180, 140, 200]
})
# Générer un graphique dans Matplotlib
data.plot.bar(x="product", y=["price", "wpu"], rot=0.0, secondary_y="wpu", legend="reverse")
pyplot.gcf().savefig("test.png")
Ajout d'étiquettes sur des barres
import matplotlib
import pandas as pd
from matplotlib import pyplot
from matplotlib.axes import Axes
matplotlib.use("TkAgg")
pyplot.style.use('ggplot')
pyplot.rcParams["font.family"] = "Cabin"
data = pd.DataFrame(data={
"product": ["pomme", "poire", "banane", "pêche"],
"price": [1.99, 2.49, 2.99, 3.49],
"wpu": [200, 180, 140, 200]
})
# Générer un graphique dans Matplotlib
data.plot.bar(x="product", y=["price", "wpu"], rot=0.0, secondary_y="wpu", legend="reverse", title="Prix et poids unitaires")
prices, weights = pyplot.gcf().axes # type: Axes
prices.legend(bbox_to_anchor=(0.0, 1.1), loc="upper left")
weights.legend(bbox_to_anchor=(1.0, 1.1), loc="upper right")
# Il est difficile de personnaliser le contenu du graphique
options: dict = {"fontsize": 8, "color": "w", "rotation": 90, "label_type": "center"}
prices.bar_label(prices.containers[0], labels=[f"{p}€" for p in data["price"]], **options)
weights.bar_label(weights.containers[0], labels=[f"{p}g" for p in data["wpu"]], **options)
pyplot.gcf().savefig("bar-labeled.png")
Le travail nécessaire est peut-être trop élevé pour une visualisation simple.
Secteurs (camembert)
import pandas as pd
from matplotlib import use, pyplot
# Utiliser tkinter
use("TkAgg")
pyplot.style.use('ggplot')
pyplot.rcParams["font.family"] = "Cabin"
# Données à afficher
data = pd.DataFrame(data={
"product": ["pomme", "poire", "banane", "pêche"],
"price": [1.99, 2.49, 2.99, 3.49]
})
# Générer un graphique dans Matplotlib
axis = data.set_index("product").plot.pie(y="price", title="Prix")
# Afficher le dernier graphique généré
pyplot.show()