Python 和 Matplotlib:在 Jupyter Notebook 中制作交互式 3D 绘图

Posted

技术标签:

【中文标题】Python 和 Matplotlib:在 Jupyter Notebook 中制作交互式 3D 绘图【英文标题】:Python & Matplotlib: Make 3D plot interactive in Jupyter Notebook 【发布时间】:2016-11-16 19:03:46 【问题描述】:

我使用 Jupyter Notebook 来分析数据集。笔记本里有很多地块,其中一些是3d地块。

我想知道是否可以使 3d 绘图交互,以便我以后可以更详细地使用它?

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


我的想法:

1。 matplotlib, %qt

这不适合我的情况,因为我需要在 3d 绘图之后继续绘图。 %qt 会干扰后面的剧情。

2。 mpld3

mpld3 在我的情况下几乎是理想的,无需重写任何东西,与 matplotlib 兼容。但是,它只支持 2D 绘图。而且我没有看到任何关于 3D 的计划 (https://github.com/mpld3/mpld3/issues/223)。

3。散景 + visjs

bokeh 画廊中没有找到任何实际的 3d 绘图示例。我只找到https://demo.bokeh.org/surface3d,它使用visjs

4。 javascript 3D 绘图?

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

【问题讨论】:

见***.com/a/33440743/1204331尝试:%matplotlib notebook @eldad-a 刚试了一下,好像不错。是否可以在一个 jupyter notebook 中混合使用 inlinenotebook 我不知道如果你只使用notebook会错过什么;只需将评论重写为答案,以便其他人更容易找到。 产生那些好看的绿色的代码是什么? @CMCDragonkai 我用 viridis 做彩色图 【参考方案1】:

试试:

%matplotlib notebook

见jakevdp回复 here

为 JupyterLab 用户编辑:

关注instructions安装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()

最后,请注意 Maarten Breddels 的reply;恕我直言ipyvolume 确实令人印象深刻(而且很有用!)。

【讨论】:

因为我正在制作大量的情节(请参阅cdn.rawgit.com/cqcn1991/Wind-Speed-Analysis/master/output_html/…) 抱歉,我仍然没有看到问题。你试过用notebook 运行它吗? 1.我在笔记本中同时使用 2d 和 3d 绘图。如何在%matplotlib notebook%matplotlib inline 之间切换 2. 我的笔记本需要很长时间才能运行(5 分钟)。使用%matplotlib notebook 将在所有单元格完成后渲染图像,而不是在一个单元格完成后。 无法真正帮助您提供有价值的信息(我没有在这个级别玩过它)。从外观和感觉来看:inline 嵌入了一个自动生成的静态 png,而notebook 让您可以像 matplotlib 一样摆弄图像,直到您点击“关闭”按钮并切换到静态图像。我会搜索一个自动“关闭”命令,该命令将放置在您不需要交互模式的无花果中。不知道现阶段有没有实现。【参考方案2】:

有一个名为ipyvolume 的新库可以满足您的需求,the documentation shows live demos。当前版本不做网格和线,但来自 git repo 的 master 做(版本 0.4 也是如此)。 (免责声明:我是作者)

【讨论】:

不错的图书馆!使用它瞧【参考方案3】:

您可以使用Plotly 库。它可以直接在 Jupyter Notebooks 中渲染交互式 3D 绘图。

为此,您首先需要通过运行安装 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 中为您绘制以下图表,您将能够与之交互。当然,您需要提供您的具体数据,而不是建议的数据。

【讨论】:

【参考方案4】:

Plotly 不在此列表中。 我已经链接了 python 绑定页面。它绝对具有动画和交互式 3D 图表。而且由于它是开源的,其中大部分都可以离线使用。当然它正在与 Jupyter 一起工作

【讨论】:

Plotly 不是我最喜欢的任何维度的绘图方式,但它确实值得在这里占有一席之地,因为一旦你知道如何使用它,它就会非常强大。我不知道为什么这被否决了。为了清楚起见 - Plotly 有一个离线模式,您可以像使用任何其他绘图库一样使用它。 IE。无需向 Plotly 服务器上传任何内容。【参考方案5】:

我想出的一个解决方案是在 iframe 中使用 vis.js 实例。这显示了笔记本中的交互式 3D 绘图,该绘图在 nbviewer 中仍然有效。 visjs代码借鉴了3D图上的示例代码page

一个小笔记本来说明这一点: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】:

对于 3-D 可视化,pythreejs 可能是笔记本电脑中的最佳方式。它利用 notebook 的交互式小部件基础设施,因此 JS 和 python 之间的连接是无缝的。

一个更高级的库是bqplot,它是用于 iPython 笔记本的基于 d3 的交互式可视化库,但它只做 2D

【讨论】:

以上是关于Python 和 Matplotlib:在 Jupyter Notebook 中制作交互式 3D 绘图的主要内容,如果未能解决你的问题,请参考以下文章

如何在ubuntu上使用pip为python3升级matplotlib?

python数据分析scipy和matplotlib

python pandas和matplotlib安装冲突[重复]

Python可视化(matplotlib)在图像中添加文本和标记(Text and Annotation)

在 matplotlib 内联和 QT 后端之间切换 Python 脚本

在 python (Matplotlib) 中使用 subplot 和 imshow 时删除白色边框