wake-up-neo.net

Die Verwendung von% matplotlib notebook nach% matplotlib inline in Jupyter Notebook funktioniert nicht

Ich verwende Jupyter Notebook zum Zeichnen von Kreisdiagramm-Figuren. 

In erste Zelle mit meinem Code habe ich einen magischen Befehl %matplotlib inline und nach diesem magischen Befehl führe ich meinen Code aus, alles funktioniert gut und meine Figur wird dargestellt. 

Aber in second cell Wenn ich %matplotlib notebook für interaktives Plotten einstelle, wird meine Figur nach dem Ausführen dieser zweiten Zelle nicht gerendert. 

Ich muss den Kernel neu starten und die Zelle erneut mit %matplotlib notebook ausführen. Vorher kann ich den %matplotlib inline-Befehl nicht ausführen. 

Hier ist mein Code für erste Zelle mit %matplotlib inline, was gut funktioniert:

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')

Danach habe ich zweite Zelle mit gleichem Code, nur %matplotlib inline wird in %matplotlib notebook geändert. Figure wird nicht gerendert, nachdem ich diese Zelle ausgeführt habe, und ich muss den Kernel neu starten und diese Zelle erneut ausführen. 

Warum?

16
delusionX

Sie haben nur die falsche Reihenfolge Ihrer Befehle. Vor dem Importieren von Pyplot in Jupyter sollte ein Backend festgelegt werden. Oder anders ausgedrückt: Nach dem Ändern des Backends muss der Pyplot erneut importiert werden.

Rufen Sie deshalb %matplotlib ... auf, bevor Sie den Pyplot importieren.

In der ersten Zelle: 

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

In der zweiten Zelle:

%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])

 enter image description here

Edit: Es stellt sich heraus, dass Sie Backends auf Jupyter dynamisch ändern können. Ich lasse die Antwort immer noch hier, weil ich denke, dass sie relevant ist und etwas Matplotlib-Magie erklärt, die manchmal herausspringt.

Der magische Befehl, wie er im source code zu sehen ist, ruft matplotlib.pyplot.switch_backend(newbackend) auf, um das Backend zu ändern. Wie in matplotlibs docs angegeben:

matplotlib.pyplot.switch_backend (newbackend)

Wechseln Sie das Standard-Backend. Diese Funktion ist experimentell und es wird nur erwartet, dass sie zu einem Bild-Backend wechselt. Wenn Sie beispielsweise eine Reihe von PostScript-Skripts über eine interaktive ipython-Sitzung ausführen möchten, können Sie vor dem Ausführen des PS-Backends zum PS-Backend wechseln, um ein paar GUI-Fenster zu vermeiden. Wenn Sie versuchen, interaktiv von einem GUI-Backend zu einem anderen zu wechseln, werden Sie explodieren.

Sie müssen also den Kernel jedes Mal neu starten, wenn Sie das Backend wechseln, da Matplotlib ein Problem hat, das Backend nach der Verwendung zu wechseln.

Dieses Problem ist hauptsächlich auf Inkompatibilitäten zwischen verschiedenen Hauptschleifen des GUI-Backends zurückzuführen. Da normalerweise jedes Backend sich auch um Threads und Benutzereingaben kümmert, können Sie Qt und Tkinter nicht nebeneinander ausführen. Diese Einschränkung wird also auf jupyter übertragen.

Siehe auch diese Frage: So wechseln Sie Backends in Matplotlib/Python

3
lolopop

In Jupyter Notebook müssen Sie matplotlib notebook in die gleiche Zeile wie die, die Sie ausführen möchten, eingeben. Selbst wenn Sie "inline" und dann "notebook" eingeben, funktioniert es trotzdem nicht. Es muss sich in derselben Zeile befinden wie der Code, den Sie rendern möchten. 

0
Michelle Abaya