matplotlib / matplotlib/ipympl

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

Aperta
#584 6 commenti 0 reazioni 0 assegnatari Vedi su GitHub

Nessuno ha ancora preso questa issue.

bug
Lingua principale
Jupyter Notebook
Stelle
1.7k
Fork
234
Metriche di merge delle PR
Nessuna PR unita negli ultimi 30g

Descrizione

## 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](https://github.com/user-attachments/files/18343071/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:

```python
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](https://github.com/user-attachments/assets/161dad71-bace-4220-990d-b3c33726055d)

Upon pressing save and exporting to HTML, the exported HTML looks like this:
![image](https://github.com/user-attachments/assets/2ca271e9-4821-4b92-a92a-80a583407d57)

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
```

Guida per i contributori

Apri la guida per i contributori

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Direzione di ricerca

Inizia con il notebook allegato e l’esportazione HTML, utilizzando le versioni indicate di Python, ipympl, Jupyter e ipywidgets. Riproduci l’animazione asincrona con figure numerate e confrontala con la creazione di una nuova figura ogni volta. Il lavoro è completato quando l’HTML esportato conserva lo stato finale di ogni figura chiusa in precedenza invece di mostrare il primo valore di set_ydata.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Valutazione

Stack tecnologico
jupyter-notebook, python
Ambito
frontend
Tipo di issue
Bug
Difficoltà
4/5
Tempo stimato
3-5 giorni
Stato di attività
Ferma
Chiarezza
Abbastanza chiara
Idoneità per principianti
35/100

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.