5 votes

L'erreur Matplotlib se produit la première fois que j'exécute la cellule Jupyter, mais pas la seconde.

La première fois, mais pas les fois suivantes, que j'exécute ce bloc de code, j'obtiens une erreur. Quelqu'un peut-il m'aider à comprendre pourquoi ?

Il n'y a pas du tout de messages précédents de l'OS sur cette erreur (du moins dans les résultats de recherche).

Je suis assez novice en matière de codage. D'après ce que je sais, il s'agit d'une erreur de séquence dans mon code. À savoir, la première fois, l'attribut n'est pas (encore) chargé, puis l'attribut est chargé plus loin dans le bloc de code, ce qui le rend disponible lorsque je réexécute le code. Le problème est que je n'arrive pas à savoir de quelle partie du code il s'agit.

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

%matplotlib notebook

def data_gen(t=0):
    cnt = 0
    while cnt < 150:
        cnt += 1
        t += 0.1
        yield t, np.sin(2*np.pi*t) * np.exp(-t/10.)

def init():
    ax.set_ylim(-1.1, 1.1)
    ax.set_xlim(0, 10)
    del xdata[:]
    del ydata[:]
    line.set_data(xdata, ydata)
    return line,

fig, ax = plt.subplots()
line, = ax.plot([], [], lw=2)
ax.grid()
xdata, ydata = [], []

def run(data):
    # update the data
    t, y = data
    xdata.append(t)
    ydata.append(y)
    xmin, xmax = ax.get_xlim()

    if t >= xmax:
        ax.set_xlim(xmin, 2*xmax)
        ax.figure.canvas.draw()
    line.set_data(xdata, ydata)

    return line,

ani = animation.FuncAnimation(fig, run, data_gen, blit=False, interval=15,
                              repeat=False, init_func=init)                                   

plt.show()

Message d'erreur

> Traceback (most recent call last):   File
> "/Users/alexfreeman/Documents/Dev/AnacondaInstall/anaconda/envs/py3-env/lib/python3.6/site-packages/matplotlib/cbook/__init__.py",
> line 387, in process
>     proxy(*args, **kwargs)   File "/Users/alexfreeman/Documents/Dev/AnacondaInstall/anaconda/envs/py3-env/lib/python3.6/site-packages/matplotlib/cbook/__init__.py",
> line 227, in __call__
>     return mtd(*args, **kwargs)   File "/Users/alexfreeman/Documents/Dev/AnacondaInstall/anaconda/envs/py3-env/lib/python3.6/site-packages/matplotlib/animation.py",
> line 1499, in _stop
>     self.event_source.remove_callback(self._loop_delay) AttributeError: 'NoneType' object has no attribute 'remove_callback'

3voto

ImportanceOfBeingErnest Points 119438

Apparemment, l'ordre d'importation de matplotlib.pyplot et de définition de l'option notebook le backend compte.

Lorsque vous mettez le %matplotlib notebook en haut, cela fonctionne bien pour moi

%matplotlib notebook
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X