Haga que la trama 3D sea interactiva en Jupyter Notebook

6 minutos de lectura

Avatar de usuario de ZK Zhao
ZK Zhao

Uso Jupyter Notebook para hacer análisis de conjuntos de datos. Hay muchos gráficos en el cuaderno y algunos de ellos son gráficos en 3D.

ingrese la descripción de la imagen aquí

Me pregunto si es posible hacer que la trama en 3D sea interactiva, para luego poder jugar con ella con más detalles.

¿Tal vez podamos agregarle un botón? Al hacer clic en él, puede aparecer un gráfico en 3D y las personas pueden hacer zoom, desplazarse, rotar, etc.


Mis pensamientos:

1. matplotlib, %qt

Esto no se ajusta a mi caso, porque necesito continuar con la trama después de la trama 3D. %qt interferirá con tramas posteriores.

2. mpld3

mpld3 es casi ideal en mi caso, no es necesario reescribir nada, compatible con matplotlib. Sin embargo, solo es compatible con la trama 2D. Y no vi ningún plan trabajando en 3D (https://github.com/mpld3/mpld3/issues/223).

3. bokeh + vistas

No encontré ningún ejemplo real de trama 3d en bokeh galería. solo encuentro https://demo.bokeh.org/surface3dque utiliza visjs.

4. ¿Trama 3D de Javascript?

Dado que lo que necesito es solo línea y fuente, ¿es posible pasar los datos a js plot usando js en el navegador para que sea interactivo? (Entonces es posible que también necesitemos agregar el eje 3D). Esto puede ser similar a visjsy mpld3.

  • consulte stackoverflow.com/a/33440743/1204331 intente: %matplotlib notebook

    – eldad-a

    9 de agosto de 2016 a las 8:16

  • @eldad-a Acabo de probarlo, parece bueno. ¿Es posible mezclar inline y notebook en un cuaderno jupyter?

    – ZK Zhao

    09/08/2016 a las 15:31

  • ¿Cuál fue el código para producir esos bonitos colores verdes?

    – CMC Dragonkai

    4 de marzo de 2017 a las 16:08

  • @CMCDragonkai Uso viridis para el mapa de colores

    – ZK Zhao

    5 de marzo de 2017 a las 10:33

  • En 2021, pyviz.org/overviews -> más allá de matplotlib le gusta “Plotly es la mejor herramienta para cualquier cosa 3D o interactiva en Python”

    – Denis

    26 de abril de 2022 a las 16:43

avatar de usuario de eldad-a
eldad-a

intentar:

%matplotlib notebook

ver la respuesta de jakevdp aquí

EDITAR para usuarios de JupyterLab:

Siga el instrucciones instalar jupyter-matplotlib

Entonces el comando mágico anterior ya no es necesario, como en el ejemplo:

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

Finalmente, tenga en cuenta la respuesta de Maarten Breddels; En mi humilde opinión ipyvolumen es realmente muy impresionante (¡y útil!).

  • Porque estoy haciendo toneladas de tramas (ver cdn.rawgit.com/cqcn1991/Wind-Speed-Analysis/master/output_HTML/…)

    – ZK Zhao

    10 de agosto de 2016 a las 7:19

  • Lo siento, pero sigo sin ver el problema. ¿Has probado a ejecutarlo con notebook?

    – eldad-a

    16 de agosto de 2016 a las 22:11

  • 1. Uso gráficos en 2D y 3D en mi cuaderno. ¿Cómo puedo cambiar entre %matplotlib notebook y %matplotlib inline 2. Mi portátil tarda mucho en funcionar (5 minutos). Usando %matplotlib notebook renderizará imágenes después de que se complete toda la celda, en lugar de después de que se complete una celda.

    – ZK Zhao

    17 de agosto de 2016 a las 6:44

  • Realmente no puedo ayudarlo con información valiosa sobre esto (no he jugado con él en este nivel). Desde la apariencia: inline incrusta un png estático generado automáticamente mientras notebook te permite jugar con una imagen a la matplotlib, hasta que presionas el botón “apagar” y cambias a la imagen estática. Habría buscado un comando de “apagado” automático que se colocaría en las figuras donde no necesita el modo interactivo. No sé si esto se implementa en esta etapa.

    – eldad-a

    17 de agosto de 2016 a las 22:23

Avatar de usuario de Oleksii Trekhleb
Oleksii Trekhleb

puedes ir con trama biblioteca. Puede representar gráficos 3D interactivos directamente en Jupyter Notebooks.

Para hacerlo, primero debe instalar Plotly ejecutando:

pip install plotly

También es posible que desee actualizar la biblioteca ejecutando:

pip install plotly --upgrade

Después de eso, en su Jupyter Notebook, puede escribir algo como:

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

Como resultado, se trazará el siguiente gráfico en Jupyter Notebook y podrá interactuar con él. Por supuesto, deberá proporcionar sus datos específicos en lugar de los sugeridos.

ingrese la descripción de la imagen aquí

Hay una nueva biblioteca llamada ipyvolumen que puede hacer lo que quieras, la documentación muestra demostraciones en vivo. La versión actual no hace mallas ni líneas, pero el maestro del repositorio de git sí lo hace (al igual que la versión 0.4). (Descargo de responsabilidad: soy el autor)

  • bonita biblioteca! usándolo w voila

    – Shpiel Meister

    25 de diciembre de 2020 a las 21:48

avatar de usuario de geniusupgrader
geniomejorador

trama falta en esta lista. He vinculado la página de enlace de python. Definitivamente tiene gráficos 3D animados e interactivos. Y dado que es de código abierto, la mayor parte está disponible sin conexión. Por supuesto que está trabajando con Jupyter

Una solución que se me ocurrió es usar un vis.js instancia en un iframe. Esto muestra un gráfico 3D interactivo dentro de un cuaderno, que todavía funciona en nbviewer. El código visjs se toma prestado del código de ejemplo en el gráfico 3D página

Un pequeño cuaderno para ilustrar esto: manifestación

El código en sí:

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

Avatar de usuario de Drew
Dibujó

Para visualización en 3D pytresjs es la mejor manera de ir probablemente en el portátil. Aprovecha la infraestructura de widgets interactivos del portátil, por lo que la conexión entre JS y python es perfecta.

Una biblioteca más avanzada es bqplot que es una biblioteca de visualización interactiva basada en d3 para el cuaderno iPython, pero solo hace 2D

Avatar de usuario de Jing Huang
jing huang

de la trama px.scatter_3d es la solución más simple que encontré para la animación de gráficos en 3D después de esforzarme con matplotlib sin suerte; puede encontrar un buen ejemplo en esta publicación: ¿Por qué el tamaño de mi diagrama de dispersión de Plotly 3D cambia aleatoriamente?

¿Ha sido útil esta solución?