Mayavi: Szenen im Jupyter-Notebook sind verschachtelt

Erstellt am 26. Okt. 2016  ·  10Kommentare  ·  Quelle: enthought/mayavi

Wenn ich in meinem Jupyter-Notebook mit x3d-Backend eine Szene nach der anderen plotte, passiert Folgendes:
screen shot 2016-10-26 at 14 29 14

Was muss ich tun, um dies zu verhindern? (Ich gehe davon aus, dass Sie das Netz von Out[2] in der Mitte des Netzes von Out[8] sehen.)

PS Vielleicht ist das wichtig - ich betreibe meinen Jupyter-Notebook-Server auf dem Remote-Computer unter VirtualGL.

Hilfreichster Kommentar

Hallo zusammen,

Entschuldigen Sie, dass ich diesem geschlossenen Thema etwas hinzugefügt habe, aber ich dachte, dies wäre eine gute Gelegenheit, Feedback zum Projekt zu geben.
Ich habe gerade die Jupyter-Notebook-Integration mit x3d getestet und nach ein paar Schluckauf zum Laufen gebracht.
Und ich habe dasselbe gefühlt wie @thoth291 : Ich habe erwartet, dass Mayavi implizit eine neue Figur für eine neue Zelle erstellt. Ich denke, ich habe das erwartet, weil dies die Standardeinstellung für Matplotlib ist, die das %matplotlib-Inline-Backend verwendet.
Man könnte aber auch für den umgekehrten Fall argumentieren: Bei Verwendung des %matplotlib-Notebook-Backends muss man Figuren explizit erstellen (wenn nicht, wird die Zeichenaktion mit der zuvor geöffneten Figur durchgeführt, was manchmal zu überraschenden Ergebnissen für den Benutzer führt).

Um es noch einmal zusammenzufassen: Verschiedene Matplotlib-Backends verhalten sich in Bezug auf die Erstellung neuer Figuren unterschiedlich. Aus Benutzersicht wäre es einfacher, Zahlen an Zellen zu binden. Wenn man jedoch dem Vorschlag des %matplotlib-Notizbuchs folgt, könnte man diesem Arbeitsablauf folgen:

fig = mlab.figure() # create new figure
s = mlab.test_triangular_mesh() # draw something on it
fig # display figure

Dies funktioniert tatsächlich, also wäre es vielleicht sinnvoll, das Beispiel-Notebook mit dieser Arbeitsweise neu zu formatieren, sowie den Abschnitt mit Tipps und Tricks, der Jupyter-Notebooks dokumentiert (http://docs.enthought.com/mayavi/mayavi/tips. html).

Jedenfalls möchte ich hinzufügen, dass ich es toll finde, dass es dieses Backend gibt. Danke für die harte Arbeit @prabhuramachandran @GaelVaroquaux !

Mit freundlichen Grüßen,
Florian

Alle 10 Kommentare

Haben Sie versucht, eine neue Figur in der neuen Zelle zu erstellen?

Ich habe das mlab.clf() zwischendurch gemacht und es hat geholfen - kein Interleaving mehr.
Danke @GaelVaroquaux !

Ist es ein Bug oder ein Feature? Soll ich die Zahl jetzt also in allen meinen Skripten löschen?

@thoth291 – Das ist dasselbe, was Sie ohne das Notizbuch sehen würden. mlab löscht den Bildschirm nicht automatisch und Sie müssen es selbst tun. Übrigens bin ich neugierig auf Ihr Setup mit VirtualGL. Welche Hardware verwenden Sie und wie haben Sie VirtualGL auf einem Remote-Computer eingerichtet? Dies wäre auch für andere nützlich, und vielleicht können wir dies unserer Dokumentation hinzufügen, wenn Sie die Details teilen könnten.

Ich schließe dieses Thema vorerst, da es sich nicht um ein Problem handelt, sondern um die Funktionsweise von mlab.

Leider bin ich nicht derjenige, der das Setup gemacht hat.
Alles, was ich sagen kann, ist, dass wir HPC-Intel-Maschinen mit 60 Kernen, viel RAM und einer guten GPU an Bord verwenden. Wir haben mehrere vnc-Server, die dort laufen. Wir verwenden tigervnc und wenn wir einen Server starten, richten wir ihn mit dem VirtualGL-Backend ein. Während Sie sich im vnc-Client befinden, müssen Sie ein benutzerdefiniertes Skript verwenden, um Ihre Apps auszuführen, um OpenGL abzufangen und durch VirtualGL zu ersetzen. In meinem Fall heißt das Skript vnc3d und ich führe es so aus:

vnc3d jupyter notebook

Dieses Setup funktioniert perfekt für uns und das einzige, was nervt, ist, dass Sie jedes Mal daran denken müssen, dieses vnc3d-Skript Ihrem Befehl voranzustellen, wenn Sie sich mit OpenGL befassen ...

@prabhuramachandran , ich denke, das ist für Jupyter-Benutzer kontraintuitiv. Oder es sollte zumindest explizit dokumentiert werden, dass man dies tun muss ( mlab.clf() ), um eine korrekte Wiedergabe sicherzustellen. Keine der 3D-Engines (für Jupyter) ist mir bewusst, dass sie diese Art von Problem haben.

@prabhuramachandran , ich denke, das ist für Jupyter-Benutzer kontraintuitiv.

Ich habe das gleiche Gefühl.

@thoth291 - danke für die Informationen zum VirtualGL-Setup. Das sieht sehr interessant und nützlich aus. In Bezug auf mlab.clf() dokumentiere ich dies gerne, obwohl ich nicht sicher bin, ob es sich um ein verwirrendes Verhalten handelt. Dies ist wirklich ziemlich ähnlich wie die Verwendung von mlab-Befehlen und dann die Verwendung mlab.savefig . Du hättest den gleichen Effekt. Was vielleicht verwirrend ist, ist, dass dies aus Sicht der Notebook-Nutzung untypisch ist, wo Benutzer plt.plot() in einer Zelle machen und nicht vor der nächsten Zelle clf() machen müssen. Was ich tun kann, ist, automatisch mlab.clf() aufzurufen, nachdem die Szene in eine PNG- oder X3D-Ausgabezelle konvertiert wurde? Würde das helfen?

Ja, das ist der verwirrende Teil. Es kann sich lohnen, ein neues Argument in den init_notebook-Aufruf zu setzen, wenn der Benutzer definieren kann, was zu tun ist. Ich kann mir vorstellen, dass es vielen mlab-Benutzern gut gehen würde, Figuren zu verschachteln (damit sie nach und nach eine Szene erstellen können) - aber das Standardverhalten sollte darin bestehen, unabhängige Figuren für jede Zelle zu haben.

Hallo zusammen,

Entschuldigen Sie, dass ich diesem geschlossenen Thema etwas hinzugefügt habe, aber ich dachte, dies wäre eine gute Gelegenheit, Feedback zum Projekt zu geben.
Ich habe gerade die Jupyter-Notebook-Integration mit x3d getestet und nach ein paar Schluckauf zum Laufen gebracht.
Und ich habe dasselbe gefühlt wie @thoth291 : Ich habe erwartet, dass Mayavi implizit eine neue Figur für eine neue Zelle erstellt. Ich denke, ich habe das erwartet, weil dies die Standardeinstellung für Matplotlib ist, die das %matplotlib-Inline-Backend verwendet.
Man könnte aber auch für den umgekehrten Fall argumentieren: Bei Verwendung des %matplotlib-Notebook-Backends muss man Figuren explizit erstellen (wenn nicht, wird die Zeichenaktion mit der zuvor geöffneten Figur durchgeführt, was manchmal zu überraschenden Ergebnissen für den Benutzer führt).

Um es noch einmal zusammenzufassen: Verschiedene Matplotlib-Backends verhalten sich in Bezug auf die Erstellung neuer Figuren unterschiedlich. Aus Benutzersicht wäre es einfacher, Zahlen an Zellen zu binden. Wenn man jedoch dem Vorschlag des %matplotlib-Notizbuchs folgt, könnte man diesem Arbeitsablauf folgen:

fig = mlab.figure() # create new figure
s = mlab.test_triangular_mesh() # draw something on it
fig # display figure

Dies funktioniert tatsächlich, also wäre es vielleicht sinnvoll, das Beispiel-Notebook mit dieser Arbeitsweise neu zu formatieren, sowie den Abschnitt mit Tipps und Tricks, der Jupyter-Notebooks dokumentiert (http://docs.enthought.com/mayavi/mayavi/tips. html).

Jedenfalls möchte ich hinzufügen, dass ich es toll finde, dass es dieses Backend gibt. Danke für die harte Arbeit @prabhuramachandran @GaelVaroquaux !

Mit freundlichen Grüßen,
Florian

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

aestrivex picture aestrivex  ·  9Kommentare

stefanoborini picture stefanoborini  ·  11Kommentare

ktavabi picture ktavabi  ·  15Kommentare

anntzer picture anntzer  ·  7Kommentare

kitchoi picture kitchoi  ·  10Kommentare