Quelle est actuellement la bonne façon de mettre à jour dynamiquement les tracés de Jupyter/iPython?

dans les réponses à comment mettre à jour dynamiquement une parcelle dans une boucle dans un carnet ipython (dans une cellule) , un exemple est donné de la façon de mettre à jour dynamiquement une parcelle dans un carnet Jupyter dans une boucle Python. Cependant, cela fonctionne en détruisant et recréant l'intrigue sur chaque itération, et un commentaire dans l'un des threads note que cette situation peut être améliorée en utilisant la nouvelle-ish %matplotlib nbagg magie, qui fournit une figure interactive intégrée dans le ordinateur portable, plutôt qu'une image statique.

cependant, cette merveilleuse nouvelle fonctionnalité nbagg semble être complètement non documentée autant que je peux dire, et je ne suis pas en mesure de trouver un exemple de la façon de l'utiliser pour mettre à jour dynamiquement un tracé. Ainsi ma question Est, comment mettre à jour efficacement une parcelle existante dans un carnet Jupyter/Python, en utilisant le backend nbagg? étant donné que la mise à jour dynamique des placettes dans matplotlib est une question délicate en général, un simple exemple de travail serait d'une grande aide. Il serait également extrêmement utile d'indiquer toute documentation sur le sujet.

pour être clair, ce que je demande: ce que je veux faire, c'est exécuter un code de simulation pour quelques itérations, puis dessiner un tracé de son état actuel, puis l'Exécuter pour quelques itérations supplémentaires, puis mettre à jour le tracé pour refléter l'état actuel, et ainsi de suite. Donc, l'idée est de dessiner une intrigue et puis, sans aucune interaction de l'utilisateur, de mettre à jour les données dans la parcelle sans détruire et recréer toute la chose.

voici un peu de code légèrement modifié de la réponse à la question liée ci-dessus, qui atteint cet objectif en dessinant l'ensemble de la figure à chaque fois. Je veux obtenir le même résultat, mais plus efficacement en utilisant nbagg .

%matplotlib inline
import time
import pylab as pl
from IPython import display
for i in range(10):
    pl.clf()
    pl.plot(pl.randn(100))
    display.display(pl.gcf())
    display.clear_output(wait=True)
    time.sleep(1.0)
52
demandé sur Community 2015-12-28 04:21:11

2 réponses

Voici un exemple qui met à jour un complot dans une boucle. Il met à jour les données de la figure et ne redessine pas la figure entière à chaque fois. Il fait l'exécution de bloc, bien que si vous êtes intéressé à exécuter un ensemble fini de simulations et sauver les résultats quelque part, il ne peut pas être un problème pour vous.

%matplotlib notebook

import numpy as np
import matplotlib.pyplot as plt
import time

def pltsin(ax, colors=['b']):
    x = np.linspace(0,1,100)
    if ax.lines:
        for line in ax.lines:
            line.set_xdata(x)
            y = np.random.random(size=(100,1))
            line.set_ydata(y)
    else:
        for color in colors:
            y = np.random.random(size=(100,1))
            ax.plot(x, y, color)
    fig.canvas.draw()

fig,ax = plt.subplots(1,1)
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_xlim(0,1)
ax.set_ylim(0,1)
for f in range(5):
    pltsin(ax, ['b', 'r'])
    time.sleep(1)

j'ai mis ça sur nbviewer ici.

Il ya un IPython version Widget de nbagg c'est un travail en cours au dépôt Matplotlib . Quand c'est disponible, qui sera probablement la meilleure façon d'utiliser nbagg .

EDIT: mis à jour pour afficher plusieurs parcelles

45
répondu pneumatics 2016-04-27 16:11:56

j'utilise jupyter-lab et cela fonctionne pour moi (adaptez - le à votre cas):

from IPython.display import clear_output
from matplotlib import pyplot as plt
import collections
%matplotlib inline

def live_plot(data_dict, figsize=(7,5), title=''):
    clear_output(wait=True)
    plt.figure(figsize=figsize)
    for label,data in data_dict.items():
        plt.plot(data, label=label)
    plt.title(title)
    plt.grid(True)
    plt.xlabel('epoch')
    plt.legend(loc='center left') # the plot evolves to the right
    plt.show();

puis dans une boucle vous peuplez un dictionnaire et vous le passez à live_plot() :

data = collections.defaultdict(list)
for i in range(100):
    data['foo'].append(np.random.random())
    data['bar'].append(np.random.random())
    data['baz'].append(np.random.random())
    live_plot(data)

assurez-vous que vous avez quelques cellules au-dessous de la parcelle, sinon la vue se brise en place chaque fois que la parcelle est redessinée.

0
répondu Ziofil 2018-10-05 20:24:12