web-dev-qa-db-fra.com

Python & Matplotlib: Rendre le tracé 3D interactif dans Jupyter Notebook

J'utilise Jupyter Notebook pour analyser les jeux de données. Le carnet contient de nombreuses parcelles, dont certaines sont des parcelles 3D.

enter image description here

Je me demande s’il est possible de rendre l’intrigue 3D interactive, afin de pouvoir y jouer plus en détail ultérieurement?

Peut-être que nous pouvons ajouter un bouton dessus? En cliquant dessus, vous pouvez faire apparaître un tracé 3D et les utilisateurs peuvent zoomer, faire un panoramique, faire pivoter, etc.


Mes pensées:

1. matplotlib,% qt

Cela ne convient pas à mon cas, car je dois continuer l'intrigue après l'intrigue 3d. %qt va interférer avec les tracés ultérieurs.

2. mpld3

mpld3 est presque idéal dans mon cas, pas besoin de réécrire quoi que ce soit, compatible avec matplotlib. Cependant, il ne prend en charge que le tracé 2D. Et je n'ai vu aucun plan fonctionner en 3D ( https://github.com/mpld3/mpld3/issues/22 ).

3. bokeh + visjs

Nous n'avons trouvé aucun exemple réel d'intrigue 3d dans la galerie bokeh. Je trouve seulement https://demo.bokehplots.com/apps/surface3d , qui utilise visjs.

4. Javascript 3D plot?

Puisque ce dont j'ai besoin, ce n’est que ligne et signe, est-il possible de transmettre les données à js plot en utilisant js dans le navigateur pour les rendre interacives? (Ensuite, il se peut que nous devions également ajouter un axe 3D.) Cela peut ressembler à visjs et à mpld3.

46
cqcn1991

essayer:

%matplotlib notebook

voir jakevdp répondre ici

EDIT pour les utilisateurs de JupyterLab:

Suivez les instructions pour installer jupyter-matplotlib

Ensuite, la commande magique ci-dessus n'est plus nécessaire, comme dans l'exemple:

# 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()

Enfin, notez Maarten Breddels ' réponse ; IMHO ipyvolume est en effet très impressionnant (et utile!).

57
eldad-a

Il existe une nouvelle bibliothèque appelée ipyvolume qui peut faire ce que vous voulez, la documentation montre des démos en direct . La version actuelle ne fait pas de maillages ni de lignes, mais master du repo git le fait (comme le fera la version 0.4). (Avertissement: je suis l'auteur)

11
Maarten Breddels

Vous pouvez aller avec Plotly bibliothèque. Il peut rendre les tracés 3D interactifs directement dans Jupyter Notebooks.

Pour ce faire, vous devez d’abord installer Plotly en exécutant:

pip install plotly

Vous pouvez également vouloir mettre à jour la bibliothèque en lançant:

pip install plotly --upgrade

Après cela, dans votre Jupyter Notebook, vous pouvez écrire quelque chose comme:

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

En conséquence, le tableau suivant sera tracé pour vous dans Jupyter Notebook et vous pourrez y interagir. Bien sûr, vous devrez fournir vos données spécifiques au lieu de celles suggérées.

enter image description here

6
Oleksii Trekhleb

Plotly est manquant dans cette liste. J'ai lié la page de liaison python. Il a définitivement des graphiques 3D animés et interactifs. Et comme il s'agit d'Open Source, la plupart d'entre eux sont disponibles hors connexion. Bien sûr, cela fonctionne avec Jupyter

4
geniusupgrader

Une solution que j'ai proposée consiste à utiliser une instance vis.js dans un iframe. Cela montre un tracé 3D interactif à l'intérieur d'un cahier, qui fonctionne toujours dans nbviewer . Le code visjs est emprunté à l'exemple de code sur le graphe 3D page

Un petit cahier pour illustrer ceci: démo

Le code lui-même:

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))
4
brm

Pour la visualisation 3-D pythreejs est la meilleure façon de faire sans doute dans le cahier. Il exploite l'infrastructure de widgets interactifs du bloc-notes pour que la connexion entre le JS et python soit transparente.

Une bibliothèque plus avancée est bqplot , qui est une bibliothèque de visualisation interactive basée sur d3 pour le portable iPython, mais elle ne fait que la 2D.

2
Drew