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.
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
.
5 réponses
essaie:
%matplotlib notebook
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!).
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)
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
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
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))