matplotlib

Par Florian Fasmeyer 1

matPlotLib membranePlot

Introduction

matplotlib est une bibliothèque Python capable de produire des graphes de qualité. matplotlib peut être utilisé dans des scripts Python, le shell Python et IPython, le notebook Jupyter, des serveurs d’application web et dans quatre outils d’interface graphique.

matPlotLib membranePlot matPlotLib contourPlot matPlotLib membranePlot matPlotLib histogramPlot

Matplotlib essai de rendre les tâches simples “simples” et de rendre possible les choses compliqués. Vous pouvez générer des graphes, histogrames, des spectres de puissance (lié à la transformée de Fourier), des graphiques à bares, des graphiques d’erreur, des nuages de dispersion, etc… en quelques lignes de code.

Pour des graphiques simples, le module matplotlib.pyplot fournit une interface comme MATLAB spécialement adaptée avec IPython.

Exemple

Matplotlib est généralement utilisé avec numpy, permettant l’usage de fonctions utiles comme arange() qui dans notre cas est utilisé pour la création de valeures à intervals réguliers de 0 à 5.

Matplotlib dispose de plus d’une centaine d’exemples (Matplotlib Examples) pour tous les cas possibles et imaginables.

Il vous est conseilé de vous rendre sur le site officiel et de jeter un œil à la galerie.

Cas simple

matPlotLib exemple2
"""Dessine cos(x) entre 0 et 2 PI."""
import matplotlib.pyplot as plt
import numpy as np

# [0, 0.1, 0.2, ..., pi*2)
xs = np.arange(0, 2 * np.pi, 0.1)
# calcule chaque y pour chaque x dans xs.
ys = np.cos(xs)
# dessine
plt.plot(xs, ys)

# affiche le graphe
plt.show()

Cas pratique de statistique

matPlotLib exemple1
"""
Fréquences cumulées et médiane.

# Made by Florian Fasmeyer 27.02.2017
"""
import matplotlib.pyplot as plt
import numpy as np


def cf(ni, n):
    """Cumule une liste de fréquences par addition."""
    cumulFreq = 0
    for i in ni:
        cumulFreq += (i / n)
        yield cumulFreq


def f(ni, n):
    """Prend une liste d'occurence et calcule la fréquence."""
    for i in ni:
        yield i / n


# Variables
ni = (4, 21, 104, 163, 121, 57, 22, 10)
i = len(ni)
n = sum(ni)
cash = np.arange(27, 51, 3)
frequence = list(f(ni, n))
frequence_cumule = list(cf(ni, n))

major_ticksX = np.arange(24, 51, 3)
major_ticksY = np.arange(0, 163, 10)
major_ticksX2 = np.arange(27, 51, 3)
major_ticksY2 = np.arange(0, 1.1, 0.1)

# Mod
mod = (cash[2] + (cash[3] - cash[2]) * (ni[3] - ni[2]) /
       ((ni[3] - ni[2]) + (ni[3] - ni[4])))

# Médiane
ccf = list(cf(ni, n))
med = (0.5 - ccf[2]) * (cash[3] - cash[2]) / (ccf[3] - ccf[2]) + cash[2]
print(f"médiane = {med:.3f}")
print(f"mod     = {mod:.3f}")

# Plot Graphes
fig = plt.figure()

# fig1
ax = fig.add_subplot(1, 2, 1)
ax.set_xticks(major_ticksX)
ax.set_yticks(major_ticksY)
plt.subplot(121)
plt.grid(True)
a = np.empty(8)
bins = np.arange(24, 51, 3)
plt.hist(np.arange(24, 48, 3), bins, weights=ni)

# fig2
ax = fig.add_subplot(1, 2, 2)
ax.set_xticks(major_ticksX2)
ax.set_yticks(major_ticksY2)
plt.subplot(122)
plt.grid(True)
plt.plot(np.arange(27, 51, 3), ccf)
plt.plot(np.arange(27, 51, 3), ccf, "ro")

a = np.empty(8)
a.fill(0.5)
plt.plot(np.arange(27, 51, 3), a)
a.fill(0.75)
plt.plot(np.arange(27, 51, 3), a)
a.fill(0.25)
plt.plot(np.arange(27, 51, 3), a)

plt.show()

Cas particulier avec toolkits pour la 3D

matPlotLib exemple3D
"""
Plot 3D.

source : PythonProgramming.net
"""
import matplotlib.pyplot as plt
from matplotlib import style
from mpl_toolkits.mplot3d import axes3d

style.use('ggplot')

fig = plt.figure()
ax1 = fig.add_subplot(111, projection='3d')

x, y, z = axes3d.get_test_data()

ax1.plot_wireframe(x, y, z, rstride=3, cstride=3)

ax1.set_xlabel('x axis')
ax1.set_ylabel('y axis')
ax1.set_zlabel('z axis')

plt.show()

How to

Liste non exhaustive expliquant comment utiliser matplotlib. Le but est d’expliquer simplement des conceptes sur lesquels vous risquez autrement de perdre du temps.

N’hésitez pas à visiter la page de Pyplot tutorial sur le site officiel si vous comprenez l’anglais ou le code.

Conseil, regardez les fonctions suivantes en détail

  • plot(*args, **kwargs)

  • triplot(*args, **kwargs)

  • bar(left, height, width=0.8, bottom=None, hold=None, data=None, **kwargs)

  • hist(x, bins=None, …, **kwargs)

  • boxplot(x, notch=None, …)

Graphique simple

Le plot() est la fonction la plus importante de matplotlib (on se demande pourquoi), pour cette raison il vous est recommandé de regarder la doc matplotlib.pyplot en détail.

matPlotLib ro
# Florian Fasmeyer 23.03.2017
"""De la statistique fait rapidement :-)."""
import matplotlib.pyplot as plt

centreClasse = [44, 46, 48, 50, 52, 54, 56]
effectifs = [2, 3, 7, 11, 8, 6, 3]

x = centreClasse
y = effectifs
plt.bar(x, y, align='center', facecolor='green', alpha=0.75)  # histograme
plt.plot(x, y, 'r--', linewidth=1)

plt.show()

Lignes, points, tirets

matPlotLib ro

Pour changer l’affichage de ligne à points ou traitillé, il suffit d’ajouter un argument au moment de plot! Voir plot().

"""Affiche des points."""
import matplotlib.pyplot as plt
import numpy as np

xs = np.arange(0, 2 * np.pi, 0.1)
ys = np.cos(xs)
# r -> red
# o -> dot
plt.plot(xs, ys, "ro")

plt.show()

Axes et axes mineurs

matPlotLib axes

Pour modifier les axes l’on a besoin d’un objet que subplot retourne, d’où l’étrange subplot(111).

Vous remarquerez l’axe mineur, qui s’affiche tous les \(0.1\) ticks.

Dans cet exemple l’on ne touche qu’à “x”. “y” est en mode par défaut, il se met directement à la bonne position. Notez bien qu rien ne vous empèche de faire des échelles étranges ou logarithmiques. Voir numpy.

"""plot un axe tout mignon."""
import matplotlib.pyplot as plt
import numpy as np

fig = plt.figure()
# de 5 à 10, par saut de 1 [5,6,7,8,9]
axe_x = np.arange(5, 10, 1)
axe_x_mineur = np.arange(5, 10, 0.1)

ax = fig.add_subplot(111)
ax.set_xticks(axe_x)
ax.set_xticks(axe_x_mineur, minor=True)

# pour axe_x, donner var Y
plt.plot(axe_x, [1, 2, 3, 1, 2], "ro")

plt.show()

Afficher plusieurs graphes

matPlotLib subplot
# source: stackoverflow
"""exemple subplot."""
import matplotlib.pyplot as plt

fig = plt.figure()

# subplot(taille_x, taille_y, position)
fig.add_subplot(221)  # haut gauche
fig.add_subplot(222)  # haut droite
fig.add_subplot(223)  # bas gauche
fig.add_subplot(224)  # bas droit

plt.show()

Vous pouvez aussi produire des assemblements asymétriques:

matPlotLib subPlot2 printscreen Florian Fasmeyer 22.03.2017
# Florian Fasmeyer 22.03.2017
"""exemple subplot cas spécial."""
import matplotlib.pyplot as plt

fig = plt.figure()
# subplot(taille_x, taille_y, position)
fig.add_subplot(1, 2, 1)  # taille(1,2) position(1)
fig.add_subplot(222)
fig.add_subplot(224)

plt.show()

Conclusion

Matplotlib est une bibliothèque extraordinaire permettant de gagner beaucoup de temps dans les applications nécessitant un affichage de données sous forme de graphiques.

Crédits

Matplotlib est un projet par John Hunter (1968 - 2012) qui à l’aide de nombreux contributeurs, ont donné une quantité incommensurable de travail dans la production de ce software. Dans le cas ou Matplotlib contribue à un projet menant à des publications scientifiques, il vous est prié de faire reconnaitre ce travail en le citant dans votre projet. Vous pouvez utiliser cette citation prête à l’usage.

Sources

1

<florian.fasmeyer@he-arc.ch>