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 действительно очень впечатляет (и полезно!).
Ответ 2
Существует новая библиотека под названием ipyvolume, которая может делать то, что вы хотите, в документации показаны демонстрации в прямом эфире. Текущая версия не делает сетки и строки, но мастер из репозитория git (как и версия 0.4). (Отказ от ответственности: я автор)
Ответ 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]()