Python & Matplotlib: Сделайте 3D-график интерактивным в Jupyter Notebook

Я использую Jupyter Notebook для анализа наборов данных. В записной книжке много сюжетов, а некоторые из них - трехмерные.

введите описание изображения здесь

Мне интересно, возможно ли сделать интерактивный 3D-сюжет, поэтому я могу позже поиграть с ним более подробно?

Может быть, мы можем добавить на него кнопку? Щелчок на нем может вывести 3D-сюжет, и люди могут масштабировать, панорамировать, вращать и т.д.


Мои книги:

1. matplotlib,% qt

Это не соответствует моему делу, потому что мне нужно продолжить график после 3D-сюжета. %qt будет влиять на более поздние графики.

2. mpld3

mpld3 почти идеален в моем случае, нет необходимости переписывать что-либо, совместимое с matplotlib. Однако он поддерживает только 2D-график. И я не видел никакого плана работы над 3D (https://github.com/mpld3/mpld3/issues/223).

3. bokeh + visjs

Не удалось найти действительный пример 3D-графика в галерее bokeh. Я нахожу https://demo.bokehplots.com/apps/surface3d, который использует visjs.

4. Javascript 3D-график?

Так как мне нужна только строка и оценка, можно ли передавать данные на js-график с помощью js в браузере, чтобы сделать его интересным? (Тогда нам может понадобиться также добавить 3d-ось.) Это может быть похоже на visjs и mpld3.

Ответы

Ответ 1

пытаться:

%matplotlib notebook

см. ответ jakevdp здесь

EDIT для пользователей JupyterLab:

Следуйте инструкциям по установке jupyter-matplotlib

Тогда более сложная магическая команда больше не нужна, как в примере:

import ipympl
import matplotlib.pyplot as plt

plt.plot([0, 1, 2, 2])
plt.show()

Наконец, обратите внимание на ответ Маартен Бреддельс; IMHO ipyvolume действительно очень впечатляет (и полезно!).

Ответ 3

В этом списке отсутствует Plotly. Я связал страницу привязки python. Он окончательно имеет анимированные и интерактивные 3D-графики. И поскольку это Open Source, большинство из них доступно в автономном режиме. Конечно, он работает с Jupyter

Ответ 4

Для трехмерной визуализации pythreejs - лучший способ, возможно, в ноутбуке. Он использует интерактивную инфраструктуру виджета ноутбука, поэтому соединение между JS и python является бесшовным.

Более продвинутая библиотека bqplot, которая представляет собой интерактивную библиотеку viz на базе d3 для ноутбука iPython, но только 2D

Ответ 5

Решением, которое я придумал, является использование экземпляра vis.js в iframe. Это показывает интерактивный 3D-график внутри ноутбука, который по-прежнему работает в nbviewer. Код visjs заимствован из примера кода на странице 3D-графика

Маленький ноутбук, чтобы проиллюстрировать это: demo

Сам код:

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

Ответ 6

Вы можете пойти с библиотекой Plotly. Он может отображать интерактивные 3D-графики непосредственно в ноутбуках Jupyter.

Для этого вам сначала нужно установить Plotly, запустив:

pip install plotly

Вы также можете обновить библиотеку, выполнив:

pip install plotly --upgrade

После этого в Jupyter Notebook вы можете написать что-то вроде:

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

В результате в Jupyter Notebook будет нанесена следующая диаграмма, и вы сможете взаимодействовать с ней. Конечно, вам нужно будет предоставить свои конкретные данные вместо запрошенных.

enter image description here