Python & Matplotlib: Machen Sie 3D-Plots in Jupyter Notebook interaktiv

75

Ich verwende Jupyter Notebook, um Datensätze zu analysieren. Das Notizbuch enthält viele Diagramme, von denen einige 3D-Diagramme sind.

Geben Sie hier die Bildbeschreibung ein

Ich frage mich, ob es möglich ist, die 3D-Handlung interaktiv zu gestalten, damit ich später genauer damit spielen kann.

Vielleicht können wir einen Button hinzufügen? Wenn Sie darauf klicken, wird ein 3D-Plot ausgeblendet und Personen können zoomen, schwenken, drehen usw.


Meine Gedanken:

1. Matplotlib,% qt

Dies passt nicht zu meinem Fall, da ich den Plot nach dem 3D-Plot fortsetzen muss. %qtwird spätere Handlungen stören.

2. mpld3

mpld3ist in meinem Fall fast ideal, keine Notwendigkeit, etwas neu zu schreiben, kompatibel mit matplotlib. Es wird jedoch nur 2D-Plot unterstützt. Und ich habe keinen Plan für 3D gesehen ( https://github.com/mpld3/mpld3/issues/223 ).

3. Bokeh + Visjs

Ich habe kein aktuelles Beispiel für eine 3D-Handlung in der bokehGalerie gefunden. Ich finde nur https://demo.bokeh.org/surface3d , das verwendet visjs.

4. Javascript 3D-Plot?

Ist es möglich, die Daten mit js im Browser an js plot zu übergeben, um sie interaktiv zu machen, da ich nur Linie und Sicherheit benötige? (Dann müssen wir möglicherweise auch die 3D-Achse hinzufügen.) Dies kann ähnlich sein wie visjsund mpld3.

cqcn1991
quelle
5
siehe stackoverflow.com/a/33440743/1204331 versuchen:%matplotlib notebook
eldad-a
1
@ eldad-a Habe es gerade versucht, das scheint gut zu sein. Ist es möglich , zu mischen inlineund notebookin einem jupyter Notebook?
cqcn1991
Ich bin mir nicht sicher, was Sie vermissen werden, wenn Sie nur verwenden notebook. Schreiben Sie den Kommentar einfach als Antwort um, damit andere ihn leichter finden können.
Eldad-a
1
Was war der Code für die Herstellung dieser gut aussehenden grünen Farben?
CMCDragonkai
2
@CMCDragonkai Ich benutze Viridis für Farbkarte
cqcn1991

Antworten:

83

Versuchen:

%matplotlib notebook

Siehe jakevdp Antwort hier

BEARBEITEN für JupyterLab-Benutzer:

Befolgen Sie die Anweisungen zum Installieren von jupyter-matplotlib

Dann wird der obige magische Befehl nicht mehr benötigt, wie im Beispiel:

# Enabling the `widget` backend.
# This requires jupyter-matplotlib a.k.a. ipympl.
# ipympl can be install via pip or conda.
%matplotlib widget
# aka import ipympl

import matplotlib.pyplot as plt

plt.plot([0, 1, 2, 2])
plt.show()

Beachten Sie abschließend die Antwort von Maarten Breddels . IMHO ipyvolume ist in der Tat sehr beeindruckend (und nützlich!).

eldad-a
quelle
Entschuldigung, aber ich sehe das Problem immer noch nicht. Haben Sie versucht, es mit auszuführen notebook?
Eldad-a
2
1. Ich verwende sowohl 2D- als auch 3D-Diagramme in meinem Notizbuch. Wie kann ich zwischen %matplotlib notebookund %matplotlib inline2 wechseln ? Die Ausführung meines Notebooks dauert lange (5 Minuten). Mit %matplotlib notebookwird gerendert, nachdem alle Zellen fertiggestellt wurden, und nicht, nachdem eine Zelle fertiggestellt wurde.
cqcn1991
2
Ich kann dir nicht wirklich mit wertvollen Informationen darüber helfen (ich habe auf dieser Ebene noch nicht damit gespielt). Vom Look and Feel: inlineBetten Sie ein automatisch generiertes statisches PNG ein, während notebookSie mit einem Bild a la Matplotlib herumspielen können, bis Sie auf die Schaltfläche "Herunterfahren" klicken und zum statischen Bild wechseln. Ich hätte nach einem automatischen "Herunterfahren" -Befehl gesucht, der in den Feigen platziert würde, in denen Sie den interaktiven Modus nicht benötigen. Ich weiß nicht, ob dies zu diesem Zeitpunkt umgesetzt wird.
Eldad-a
19

Es gibt eine neue Bibliothek namens ipyvolume , die tun kann, was Sie wollen. Die Dokumentation zeigt Live-Demos . Die aktuelle Version macht keine Meshes und Lines, aber der Master aus dem Git Repo (wie auch Version 0.4). (Haftungsausschluss: Ich bin der Autor)

Maarten Breddels
quelle
schöne Bibliothek! Verwenden Sie es w voila
ShpielMeister
18

Sie können mit Plotly Bibliothek gehen. Es kann interaktive 3D-Diagramme direkt in Jupyter-Notizbüchern rendern.

Dazu müssen Sie zuerst Plotly installieren, indem Sie Folgendes ausführen:

pip install plotly

Möglicherweise möchten Sie die Bibliothek auch aktualisieren, indem Sie Folgendes ausführen:

pip install plotly --upgrade

Danach können Sie in Ihr Jupyter-Notizbuch etwas schreiben wie:

# Import dependencies
import plotly
import plotly.graph_objs as go

# Configure Plotly to be rendered inline in the notebook.
plotly.offline.init_notebook_mode()

# Configure the trace.
trace = go.Scatter3d(
    x=[1, 2, 3],  # <-- Put your data instead
    y=[4, 5, 6],  # <-- Put your data instead
    z=[7, 8, 9],  # <-- Put your data instead
    mode='markers',
    marker={
        'size': 10,
        'opacity': 0.8,
    }
)

# Configure the layout.
layout = go.Layout(
    margin={'l': 0, 'r': 0, 'b': 0, 't': 0}
)

data = [trace]

plot_figure = go.Figure(data=data, layout=layout)

# Render the plot.
plotly.offline.iplot(plot_figure)

Als Ergebnis wird das folgende Diagramm für Sie in Jupyter Notebook aufgezeichnet und Sie können damit interagieren. Natürlich müssen Sie Ihre spezifischen Daten anstelle der vorgeschlagenen angeben.

Geben Sie hier die Bildbeschreibung ein

Oleksii Trekhleb
quelle
5

Plotly fehlt in dieser Liste. Ich habe die Python-Bindungsseite verlinkt. Es hat definitiv animierte und interaktive 3D-Diagramme. Und da es Open Source ist, ist das meiste davon offline verfügbar. Natürlich funktioniert es mit Jupyter

Genieupgrader
quelle
Plotly ist nicht meine bevorzugte Art, in irgendeiner Dimension zu plotten, aber es verdient hier einen Platz, weil es ziemlich fähig ist, wenn Sie erst einmal herausgefunden haben, wie man es benutzt. Ich weiß nicht, warum dies abgelehnt wurde. Und um ganz klar zu sein: Es gibt einen Offline-Modus für Plotly, in dem Sie wie in jeder anderen Plot-Bibliothek damit arbeiten können. Das heißt, ohne dass etwas auf die Plotly-Server hochgeladen werden muss.
PaulG
4

Eine Lösung, die ich gefunden habe, ist die Verwendung einer vis.js- Instanz in einem Iframe. Dies zeigt ein interaktives 3D-Diagramm in einem Notizbuch, das in nbviewer weiterhin funktioniert . Der visjs Code aus dem Beispielcode auf der 3D - Grafik entlehnt Seite

Ein kleines Notizbuch zur Veranschaulichung: Demo

Der Code selbst:

from IPython.core.display import display, HTML
import json

def plot3D(X, Y, Z, height=600, xlabel = "X", ylabel = "Y", zlabel = "Z", initialCamera = None):

    options = {
        "width": "100%",
        "style": "surface",
        "showPerspective": True,
        "showGrid": True,
        "showShadow": False,
        "keepAspectRatio": True,
        "height": str(height) + "px"
    }

    if initialCamera:
        options["cameraPosition"] = initialCamera

    data = [ {"x": X[y,x], "y": Y[y,x], "z": Z[y,x]} for y in range(X.shape[0]) for x in range(X.shape[1]) ]
    visCode = r"""
       <link href="https://cdnjs.cloudflare.com/ajax/libs/vis/4.21.0/vis.min.css" type="text/css" rel="stylesheet" />
       <script src="https://cdnjs.cloudflare.com/ajax/libs/vis/4.21.0/vis.min.js"></script>
       <div id="pos" style="top:0px;left:0px;position:absolute;"></div>
       <div id="visualization"></div>
       <script type="text/javascript">
        var data = new vis.DataSet();
        data.add(""" + json.dumps(data) + """);
        var options = """ + json.dumps(options) + """;
        var container = document.getElementById("visualization");
        var graph3d = new vis.Graph3d(container, data, options);
        graph3d.on("cameraPositionChange", function(evt)
        {
            elem = document.getElementById("pos");
            elem.innerHTML = "H: " + evt.horizontal + "<br>V: " + evt.vertical + "<br>D: " + evt.distance;
        });
       </script>
    """
    htmlCode = "<iframe srcdoc='"+visCode+"' width='100%' height='" + str(height) + "px' style='border:0;' scrolling='no'> </iframe>"
    display(HTML(htmlCode))
brm
quelle
2

Für die 3D -Visualisierung ist Pythonreejs wahrscheinlich der beste Weg, um im Notebook zu arbeiten. Es nutzt die interaktive Widget-Infrastruktur des Notebooks, sodass die Verbindung zwischen JS und Python nahtlos ist.

Eine erweiterte Bibliothek ist bqplot , eine d3-basierte interaktive Bibliothek für das iPython-Notebook, jedoch nur 2D

Drew
quelle