Python & Matplotlib: créer un tracé en 3D interactif dans le carnet de notes de Jupyter

J'utilise le carnet Jupyter pour faire l'analyse des ensembles de données. Il ya beaucoup de parcelles dans le carnet, et certains d'entre eux sont des parcelles 3d.

enter image description here

je me demande s'il est possible de rendre l'intrigue 3d interactive, donc je peux plus tard jouer avec elle dans plus de détails?

peut-être pouvons-nous ajouter un bouton dessus? En cliquant dessus, vous pouvez faire apparaître un tracé en 3d et les gens peuvent zoomer, tourner, etc.


Mon thougths:

1. matplotlib, %qt

cela ne correspond pas à mon cas, parce que je dois continuer parcelle après la parcelle 3d. %qt interférera avec les parcelles ultérieures.

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 supporte que le tracé 2D. Et je n'ai vu aucun plan travailler sur la 3D (https://github.com/mpld3/mpld3/issues/223).

3. bokeh+ visjs!--23-->

N'ai pas trouvé réellement exemple de graphique 3d bokeh galerie. Je ne trouve https://demo.bokehplots.com/apps/surface3d, qui utilise visjs.

4. Javascript graphique 3D?

comme j'ai juste besoin de line et surce, est-il possible de passer les données à js plot en utilisant js dans le navigateur pour les rendre interactives? (Nous pourrions alors avoir besoin d'ajouter l'Axe 3d.) Il peut être similaire à visjs et mpld3.

27
demandé sur cqcn1991 2016-07-14 05:11:57

5 réponses

essaie:

%matplotlib notebook

voir jakevdp répondre ici

Modifier pour les utilisateurs de JupyterLab:

Suivre instructions installer jupyter-matplotlib

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

import ipympl
import matplotlib.pyplot as plt

plt.plot([0, 1, 2, 2])
plt.show()
répondre; à mon humble avis ipyvolume est en effet très impressionnant (et utile!).

32
répondu eldad-a 2018-04-03 04:34:30

Il y a une nouvelle bibliothèque appelée ipyvolume que peut faire ce que vous voulez, la documentation montre démonstrations en direct. La version actuelle ne fait pas de mailles ni de lignes, mais master de la git repo en fait (comme la version 0.4). (Disclaimer: je suis l'auteur)

7
répondu Maarten Breddels 2017-05-24 17:35:03

Pour 3-D de visualisation pythreejs est la meilleure façon d'aller probablement dans le cahier. Il exploite l'infrastructure interactive du widget du notebook, de sorte que la connexion entre le JS et python est transparente.

une bibliothèque plus avancée est bqplot qui est une bibliothèque interactive viz basée sur d3 pour le bloc-notes iPython, mais elle ne fait que 2D

2
répondu Drew 2016-08-10 15:24:48

Plotly manque dans cette liste. J'ai relié la page de liaison de python. Il a définitivement animé et Interatif des cartes 3D. Et comme il est Open Source la plupart de ce qui est disponible hors ligne. Bien sûr, il fonctionne avec Jupyter

2
répondu geniusupgrader 2017-11-20 14:28:25

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

Un petit carnet 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))
2
répondu brm 2018-02-08 21:41:39