Python和Matplotlib:在Jupyter Notebook中使3D图互动


76

我使用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/surface3dvisjs

4. Javascript 3D图?

由于我只需要行和序,是否有可能在浏览器中使用js将数据传递到js绘图以使其具有交互性?(然后,我们可能还需要添加3d轴。)这可能类似于visjsmpld3


5
参见stackoverflow.com/a/33440743/1204331尝试:%matplotlib notebook
eldad-a

1
@ eldad-a刚刚尝试过,这看起来不错。是否有可能混合inline,并notebook在一个jupyter笔记本?
cqcn1991'8

我不确定仅使用会错过什么notebook; 只是将评论重写为答案,以便其他人更容易找到。
eldad-a

1
产生那些漂亮的绿色的代码是什么?
CMCDragonkai

2
@CMCDragonkai我将viridis用于彩色地图
cqcn1991

Answers:


83

尝试:

%matplotlib notebook

看到jakevdp在这里回复

编辑JupyterLab用户:

按照说明安装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的回复;恕我直言,ipyvolume确实非常令人印象深刻(并且非常有用!)。



抱歉,但是我仍然没有看到这个问题。您尝试过使用它notebook吗?
eldad-a

2
1.我在笔记本中同时使用2d和3d图。如何在%matplotlib notebook和之间切换%matplotlib inline。2.我的笔记本需要很长时间才能运行(5分钟)。使用%matplotlib notebook将在所有单元完成后而不是在单元完成后渲染图像。
cqcn1991 '16

2
无法提供有关此方面的有价值的信息的真正帮助(我尚未在此级别上试用过)。从外观上:inline嵌入自动生成的静态png,同时notebook让您摆弄la matplotlib图像,直到单击“关闭”按钮并切换到静态图像为止。我会搜索一个自动“关闭”命令,该命令将放置在无花果中不需要交互模式的位置。我不知道这是否在现阶段实施。
eldad-a


18

您可以使用Plotly库。它可以直接在Jupyter Notebook中渲染交互式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中为您绘制,并且您将能够与其进行交互。当然,您将需要提供您的特定数据,而不是建议的数据。

在此处输入图片说明


5

在此列表中缺少Plotly。我已经链接了python绑定页面。它绝对具有动画和交互式3D图表。而且由于它是开源的,所以大多数都可以脱机使用。当然,它正在与Jupyter合作


Plotly不是我最喜欢的在任何维度上进行绘制的方法,但是它确实值得在这里放置,因为一旦您弄清楚如何使用它,它就已经足够了。我不知道为什么这被否决了。需要明确的是-Plotly有一个离线模式,您可以像使用其他任何绘图库一样使用它。即无需将任何内容上传到Plotly服务器。
PaulG

4

我想出的一个解决方案是在iframe中使用vis.js实例。这显示了笔记本内部的交互式3D图,该图仍可在nbviewer中使用。visjs代码是从3D图形页面上的示例代码中借用的

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

代码本身:

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

2

对于3D可视化,pythreejs是最好的笔记本电脑安装方式。它利用了笔记本的交互式小部件基础结构,因此JS和python之间的连接是无缝的。

bqplot是更高级的库,它是用于iPython Notebook的基于d3的交互式viz库,但仅支持2D

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.