Python & Matplotlib: 在 Jupiter Notebook 中实现3D 情节的交互

我使用木星笔记本进行数据集分析。笔记本中有很多情节,其中一些是3D 情节。

enter image description here

我想知道是否有可能使3D 情节的互动,所以我可以稍后发挥它在更多的细节?

也许我们可以在上面加个按钮?点击它可以弹出一个3D 图形,人们可以缩放,平移,旋转等。


我的想法是:

1. matplotlib,% qt

This does not fit my case, because I need to continue plot after the 3d plot. %qt will interfere with later plots.

2. mpld3

在我的案例中,mpld3几乎是理想的,不需要重写任何东西,与 matplotlib 兼容。但是,它只支持2D 情节。而且我没有看到任何3D (https://github.com/mpld3/mpld3/issues/223)的工作计划。

3. bokeh + visjs

bokeh图库中没有找到任何实际的3D 情节示例,我只找到了使用 visjshttps://demo.bokeh.org/surface3d

4. Javascript 3D 情节?

既然我需要的只是线和曲面,那么是否有可能在浏览器中使用 js 将数据传递给 js plot 以使其具有交互性呢?(然后我们可能还需要添加3D 坐标轴。)这可能类似于 visjsmpld3

182213 次浏览

尝试:

%matplotlib notebook

Jakevdp答复 给你

针对 Jupiter yterLab 用户的编辑:

按照 指示安装 Jupyter-matplotlib

然后,就不再需要上面的魔法命令了,如下例所示:

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

Finally, note Maarten Breddels' 回答; IMHO 体积 is indeed very impressive (and useful!).

对于三维可视化 Pythree是最好的方式去可能在笔记本。它利用了笔记本的交互式小部件基础结构,因此 JS 和 python 之间的连接是无缝的。

更高级的库是 bqplot,它是一个针对 iPython 笔记本的基于 d3的交互式 viz 库,但它只支持2D

There is a new library called 体积 that may do what you want, 文档显示了现场演示. The current version doesn't do meshes and lines, but master from the git repo does (as will version 0.4). (Disclaimer: I'm the author)

阴谋 在这个列表中缺失。 我已经链接了 Python 绑定页面。它肯定有动画和交互式的3D 图表。因为它是开源的,所以大部分都可以离线使用。当然,它与木星一起工作

我想到的一个解决方案是在 iframe 中使用一个 Vis Js实例。这显示了一个交互式的3D 情节内的笔记本,它仍然在 观众工作。Visjs 代码借自3D 图 page上的示例代码

一个小笔记本来说明这一点: 小样

代码本身:

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

你可以使用 阴谋库,它可以直接在木星笔记本中呈现交互式3D 情节。

为此,您首先需要通过运行以下命令安装 Plotly:

pip install plotly

您可能还想通过运行以下命令来升级库:

pip install plotly --upgrade

在那之后,在你的朱庇特笔记本上,你可能会写下这样的东西:

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

因此,下面的图表将为您绘制在木星笔记本,你将能够与它互动。当然,您需要提供您的具体数据,而不是建议的一个。

enter image description here