%matplotlib notebook gebruiken nadat %matplotlib inline in Jupyter Notebook werkt niet

Ik gebruik Jupyter Notebook voor het plotten van cirkeldiagrammen.

In eerste celmet mijn code heb ik een magische opdracht %matplotlib inlineen na deze magische opdracht voer ik mijn code uit, alles werkt goed en mijn figuur wordt weergegeven.

Maar in tweede celwanneer ik %matplotlib notebookinstel voor interactief plotten, wordt mijn figuur niet weergegeven na het uitvoeren van deze tweede cel.

Ik moet de kernel opnieuw opstarten en cel opnieuw uitvoeren met %matplotlib notebooken kan de opdracht %matplotlib inlinedaarvoor niet uitvoeren.

Hier is mijn code voor eerste celmet %matplotlib inline, die goed wordt weergegeven:

import matplotlib.pyplot as plt
%matplotlib inline
labels = "No", "Yes"
sizes = [100, 50]
fig, ax = plt.subplots(figsize=(6, 6))
_, texts, autotexts = ax.pie(sizes, explode=explode, labels=labels, colors=colors, autopct='%1.1f%%',
             shadow=False, startangle=90)
ax.axis('equal')

Daarna heb ik tweede celmet dezelfde code, alleen %matplotlib inlinewordt gewijzigd in %matplotlib notebook. Het cijfer wordt niet weergegeven nadat ik deze cel heb uitgevoerd en ik moet de kernel opnieuw opstarten en deze cel opnieuw uitvoeren.

Waarom?


Antwoord 1, autoriteit 100%

Je hebt gewoon de verkeerde volgorde van je commando’s. Er moet een backend worden ingesteld voordat pyplot in jupyter wordt geïmporteerd. Of met andere woorden, na het wijzigen van de backend moet pyplot opnieuw worden geïmporteerd.

Bel daarom %matplotlib ...aan voordat u pyplot importeert.

In eerste cel:

%matplotlib inline
import matplotlib.pyplot as plt
plt.plot([1,1.6,3])

In tweede cel:

%matplotlib notebook
#calling it a second time may prevent some graphics errors
%matplotlib notebook  
import matplotlib.pyplot as plt
plt.plot([1,1.6,3])


Antwoord 2, autoriteit 12%

Bewerken: het blijkt dat je backends dynamisch kunt wijzigen op jupyter. Laat het antwoord hier nog steeds omdat ik denk dat het relevant is en legt wat matplotlib-magie uit die soms tevoorschijn kan komen.

Het magische commando, zoals te zien in de bron code, roept matplotlib.pyplot.switch_backend(newbackend)aan om de backend te wijzigen. Zoals vermeld in matplotlib’s docs:

matplotlib.pyplot.switch_backend(newbackend)

Schakel de standaard backend in. Deze functie is experimenteel en zal naar verwachting alleen werken bij het overschakelen naar een image-backend. als je bijvoorbeeld een aantal PostScript-scripts hebt die je wilt uitvoeren vanuit een interactieve ipython-sessie, wil je misschien overschakelen naar de PS-backend voordat je ze uitvoert om te voorkomen dat er een heleboel GUI-vensters verschijnen. Als je interactief probeert over te schakelen van de ene GUI-backend naar de andere, zul je exploderen..

Dus je moet de kernel echt elke keer opnieuw opstarten als je van backend wisselt, omdat matplotlib een probleem heeft om van backend te wisselen nadat het is gebruikt.

Dit probleem is voornamelijk te wijten aan incompatibiliteit tussen verschillende hoofdlussen van de GUI-backend. Omdat normaal gesproken elke backend ook voor threads en gebruikersinvoer zorgt, kun je Qt en Tkinter niet naast elkaar draaien. Dus die beperking wordt overgedragen naar jupyter.

Zie ook deze vraag: Hoe van backend te wisselen in matplotlib / Python


Antwoord 3

In Jupyter-notebook moet u matplotlib-notebook invoeren in dezelfde regel als degene die u wilt uitvoeren. Zelfs als u “inline” invoert, gevolgd door “notebook”, zal het nog steeds niet werken. Het moet op dezelfde regel staan als de code die u wilt weergeven.

Other episodes