Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

Licence CC BY-NC-ND Thierry Parmentelat & Arnaud Legout Inria - UCA

Complément - niveau basique

Pour conclure cette série sur les outils de visualisation, nous allons voir quelques fonctionnalités disponibles uniquement dans l’environnement des notebooks, et qui offrent des possibilités supplémentaires par rapport aux visualisations que l’on a vues jusqu’à maintenant.

installation

Pour exécuter ou créer un notebook depuis votre ordinateur, il vous faut installer Jupyter, ce qui se fait bien sûr depuis le terminal :

pip install jupyter

En 2023 on recommande l’interface Jupyter dite lab:

Pour le lancer, tapez dans le terminal:

jupyter lab

Contenus

Pour le contenu des notebooks :

Courbes

import numpy as np
import matplotlib.pyplot as plt

Comme on l’a déjà vu plein de fois, la bonne façon de créer un graphique matplotlib c’est avec la formule magique suivante :

# ça c'est pour choisir la sortie 'interactive'
# nécessite un `pip install ipympl`
%matplotlib ipympl

À noter

Avec le driver ipympl, il y a pas mal de possibilités qui sont très pratiques :

À titre d’exercice, sur cette courbe le nombre d’or correspond à une des racines du polynôme, à vous de trouver sa valeur avec une précision de 10-6

plt.figure(figsize=(8, 3))
X = np.linspace(-2, 2)
ZERO = X * 0
def golden(x):
    return x**2 - x - 1
plt.plot(X, golden(X));
plt.plot(X, ZERO);
Loading...

Voici à quoi je suis arrivé de mon côté (je ne dis pas que c’est forcément la méthode la plus rapide pour trouver le nombre d’or ;-).
Mais tous les outils de visualisation décents vont proposer des mécanismes analogues, soyez-y attentifs car ça fait parfois gagner beaucoup de temps.

Exemple de notebook interactif

Je vous signale enfin un exemple de notebook publié par la célèbre revue Nature, qui pourra vous donner une idée de ce qu’il est possible de faire avec un notebook interactif. Interactif dans le sens où on peut faire varier les paramètres d’une expérience et voir l’impact du changement se refléter immédiatement sur la visualisation.

Mise à jour: comme il n’est malheureusement plus actif en ligne semble-t-il, je vous invite à le faire marcher localement à partir de la version sur github ici.

Complément - niveau intermédiaire

Une visualisation interactive simple : interact

Pour refaire de notre coté quelque chose d’analogue, nous allons écrire une sorte d’oscilloscope virtuel, c’est-à-dire animer la fonction sinus, avec un bouton pour régler la fréquence.
Pour cela nous allons utiliser la fonction interact; c’est un utilitaire qui fait partie de l’écosystème des notebooks, et plus précisément du module ipywidgets.

Note: avec le mode %matplotlib inline le code est légèrement plus simple, mais pour rester cohérent, nous montrons ici comment faire ce genre de choses avec le mode %matplotlib ipympl

from ipywidgets import interact

Nous expliquerons tout cela un peu plus loin, mais voici comment on pourrait s’y prendre.

# créer une figure - et trouver les axes
# on le fait une seule fois - et donc pas dans la fonction sinus 
fig, ax = plt.subplots()

# cette fonction va être appelée sans arrêt
# son job est de nettoyer la courbe précédente
# et d'afficher la nouvelle pour freq
def sinus(freq):
    # le domaine en X
    X = np.linspace(0., 4*np.pi, 200)
    # les Y
    Y = np.sin(freq*X)

    # nettoyer la ligne précédente
    for line in ax.lines:
        line.remove()
    # dessiner la courbe pour freq
    # (on précise une couleur, sinon mpl en choisit 
    # une au hasard à chaque fois, c'est vilain..)
    ax.plot(X, Y, color='DarkBlue')

# et maintenant le morceau de bravoure
# on affiche un "slider" - une réglette - qui réappelle 'sinus' 
# à chaque changement de la valeur de 'freq'

interact(sinus, freq=(0.5, 10., 0.25));

# voyez comment vous pouvez choisir 'freq' avec la réglette
Loading...
Loading...

Mécanisme d’interact

Le mécanisme général, c’est que la fonction interact s’attend à recevoir :

Comme dans mon cas la fonction sinus attend un paramètre nommé freq, le deuxième argument de interact lui est passé aussi avec le nom freq; c’est pourquoi à la fin on appelle:

interact(sinus, freq=...)

Les objets Slider

Chacun des arguments à interact - en plus de la fonction - correspond à un objet de type Slider (dans la ménagerie de ipywidgets). Ici en passant juste le tuple (0.5, 10., 0.25) j’utilise un raccourci pour dire que je veux pouvoir régler le paramètre freq sur une plage allant de 0.5 à 10 avec un pas de 0.25.

Mon premier exemple avec interact est en réalité équivalent à ceci :

from ipywidgets import FloatSlider
# exactement équivalent à la version ci-dessus

# je recrée une nouvelle figure, sinon la réglette
# irait modifier .. la figure ci-dessus
fig, ax = plt.subplots()

interact(sinus, freq=FloatSlider(min=0.5, max=10., step=0.25));
Loading...
Loading...

Mais en utilisant la forme bavarde, je peux choisir davantage d’options, comme notamment :

fig, ax = plt.subplots()

# exactement équivalent à la version ci-dessus
# sauf qu'on ne redessine que lorsque la réglette
# est relâchée
interact(sinus, freq=FloatSlider(min=0.5, max=10., 
                                 step=0.25, value=1.,
                                 continuous_update=False));
Loading...
Loading...

Plusieurs paramètres

Voyons tout de suite un exemple avec deux paramètres, je vais écrire maintenant une fonction qui me permet de changer aussi la phase.
Et donc maintenant:

fig, ax = plt.subplots()

def sinus2(freq, phase):
    X = np.linspace(0., 4*np.pi, 200)
    Y = np.sin(freq*(X+phase))
    
    for line in ax.lines:
        line.remove()
    ax.plot(X, Y, color='DarkGreen')

interact(sinus2, 
         freq=FloatSlider(min=0.5, max=10., step=0.5),
         phase=FloatSlider(min=0., max=2*np.pi, step=np.pi/6));
Loading...
Loading...

Bouche-trou : fixed

Si j’ai une fonction qui prend plus de paramètres que je ne veux montrer de réglettes, je peux fixer un des paramètres en utilisant l’utilitaire fixed; c’est comme si on créait une réglette avec une valeur fixe, du coup on n’a même pas besoin de montrer cette réglette.

Pour illustrer ce point on va utiliser sinus2 et reproduire le comportement qu’on avait avec sinus:

from ipywidgets import fixed
fig, ax = plt.subplots()

interact(sinus2, 
         # le premier paramètre de sinus2 est toujours 1
         freq=fixed(1),
         # et on peut régler le second paramètre uniquement
         phase=FloatSlider(min=0., max=2*np.pi, step=np.pi/6));
Loading...
Loading...

Widgets

Sachez qu’il existe toute une famille de widgets, dont FloatSlider est l’exemple le plus courant, mais vous pouvez aussi :

Bref, vous pouvez créer une mini interface-utilisateur avec des objets graphiques simples choisis dans une palette assez complète pour ce type d’application.

Voyez les détails complets sur readthedocs.io

# de même qu'un tuple était ci-dessus un raccourci pour un FloatSlider
# une liste ou un dictionnaire est transformé(e) en un Dropdown
fig, ax = plt.subplots()
interact(sinus, freq={'rapide': 10., 'moyenne': 1., 'lente': 0.1});
Loading...
Loading...

Voyez la liste complète des widgets ici.

Forme avec décorateur

Signalons enfin, et pour finir, qu’il est possible également d’utiliser interact comme un décorateur, qui donne une forme un tout petit peu plus concise; voici comment on récrirait alors notre tout premier exemple:

fig, ax = plt.subplots()

@interact(freq=(0.5, 10., 0.25))
def sinus(freq):
    X = np.linspace(0., 4*np.pi, 200)
    Y = np.sin(freq*X)

    # nettoyer la ligne précédente
    for line in ax.lines:
        line.remove()
    # dessiner la courbe pour freq
    # (on précise une couleur, sinon mpl en choisit 
    # une au hasard à chaque fois, c'est vilain..)
    ax.plot(X, Y, color='DarkBlue')
Loading...
Loading...