matplotlib / matplotlib/ipympl

Closed Figure's state is silently changed in HTML export when plotting asynchronously

Offen
#584 6 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

bug
Vorherrschende Sprache
Jupyter Notebook
Sterne
1.7k
Forks
234
PR-Merge-Kennzahlen
Keine gemergten PRs in 30 T.

Beschreibung

Describe the issue

I know, this is a seemingly contrived example, but it's a real-world problem for me.

See attached Notebook and according HTML export
issue.zip

I'm running the notebook cell by cell, where I only start the next cell when the previous animation has been finished. The animation stops automatically. The code for animation is:

def runPlot(duration):
    plt.close('all')
    fig = plt.figure(1)
    t = np.linspace(0, 1, 100)
    data_line = plt.plot(t, np.sin(6.28*2*t))[0]
    
    def _impl():
        start = time.time()
        it = 0
        while time.time() - start < duration:
            freq = time.time() - start
            if it == 0:
                data_line.set_ydata(t)
            else:
                data_line.set_ydata(np.sin(6.28*t*freq))
            it = it + 1
                
            fig.canvas.draw()   
            time.sleep(0.03)
        
        
    T = threading.Thread(target=_impl)
    T.start()

Within this code, a thread is started which shows a figure and continuously updates the ydata of the plotted line. The cell immediately returns, but the thread runs for the given amount of seconds. This leads to an animation in the notebook. Note that in the first iteration, a linear line is plotted instead of the sine wave. After running all cells, the notebook looks like this:
image

Upon pressing save and exporting to HTML, the exported HTML looks like this:
image

Apparently, for the HTML export, the state of the first plot widget has been replaced by the data that was first set by set_ydata. Adding more calls to runPlot only keeps the last figure in the correct shape for export, whereas the other figures contain the data initially set by set_ydata.

The problem does not happen when I create a new figure without a number all the time, i.e. replace this

    plt.close('all')
    fig = plt.figure(1)

with

fig = plt.figure()

However, as all figures are closed by close('all'), no data should be changed in previously open figures anymore.

Versions

$ python -c "import sys; print('\n',sys.version); import ipympl; print('ipympl version:', ipympl.__version__)" && jupyter --version && jupyter nbextension list && jupyter labextension list

 3.13.1 (main, Dec 19 2024, 10:35:14) [GCC 11.1.0]
ipympl version: 0.9.5
Selected Jupyter core packages...
IPython          : 8.30.0
ipykernel        : 6.29.5
ipywidgets       : 8.1.5
jupyter_client   : 8.6.3
jupyter_core     : 5.7.2
jupyter_server   : 2.14.2
jupyterlab       : 4.3.4
nbclient         : 0.10.2
nbconvert        : 7.16.4
nbformat         : 5.10.4
notebook         : 7.3.1
qtconsole        : not installed
traitlets        : 5.14.3

Beitragsleitfaden

Beitragsleitfaden öffnen

Erste Schritte

  1. Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
  3. Forke das Repository und arbeite in einem Branch.
  4. Öffne einen Pull Request, der die Issue-Nummer nennt.

Rechercherichtung

Beginne mit dem angehängten Notebook und dem HTML-Export und verwende die angegebenen Versionen von Python, ipympl, Jupyter und ipywidgets. Reproduziere die asynchrone Animation mit nummerierten Abbildungen und vergleiche sie damit, jedes Mal eine neue Abbildung zu erstellen. Als abgeschlossen gilt die Aufgabe, wenn der exportierte HTML-Code den Endzustand jeder zuvor geschlossenen Abbildung beibehält, statt den ersten set_ydata-Wert anzuzeigen.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
jupyter-notebook, python
Bereich
frontend
Issue-Typ
Bug
Schwierigkeit
4/5
Geschätzter Aufwand
3-5 Tage
Aktivitätsstatus
Veraltet
Klarheit
Größtenteils klar
Anfängerfreundlichkeit
35/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.