J'utilise Jupyter Notebook pour analyser les jeux de données. Le carnet contient de nombreuses parcelles, dont certaines sont des parcelles 3D.
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:
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.
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 ).
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
.
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
.
essayer:
%matplotlib notebook
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!).
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)
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.
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
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))
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.