首页 文章

Python和Matplotlib:在Jupyter Notebook中进行3D绘图交互

提问于
浏览
29

我使用Jupyter Notebook来分析数据集 . 笔记本中有很多情节,其中一些是3d图 .

enter image description here

我想知道是否有可能使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.bokehplots.com/apps/surface3d,它使用 visjs .

4. Javascript 3D情节?

因为我需要的只是线和外观,是否可以使用浏览器中的js将数据传递给js plot以使其具有交互性? (然后我们可能还需要添加3d轴 . )这可能类似于 visjsmpld3 .

6 回答

  • 39

    尝试:

    %matplotlib notebook

    jakevdp回复here

    EDIT for JupyterLab users:

    按照instructions安装jupyter-matplotlib

    然后不再需要上面的魔术命令,如示例中所示:

    import ipympl
    import matplotlib.pyplot as plt
    
    plt.plot([0, 1, 2, 2])
    plt.show()
    

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

  • 2

    有一个名为ipyvolume的新库可以做你想要的,the documentation shows live demos . 目前的版本不是作者的作者)

  • 2

    此列表中缺少Plotly . 我已经链接了python绑定页面 . 它最终具有动画和交互式3D图表 . 由于它是开放源代码,因此大部分内容都可以脱机使用 . 当然它正在与Jupyter合作

  • 0

    对于三维可视化pythreejs是可能在笔记本中使用的最佳方式 . 它利用笔记本电脑的交互式小部件基础架构,因此JS和python之间的连接是无缝的 .

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

  • 9

    我想出的解决方案是在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))
    
  • 3

    你可以使用Plotly库 . 它可以直接在Jupyter笔记本中呈现交互式3D图 .

    为此,首先需要运行Plotly:

    pip install plotly
    

    您可能还希望通过运行来升级库:

    pip install plotly --upgrade
    

    在你之后的Jupyter笔记本中你可以写下这样的东西:

    # 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中为您绘制,您将能够与它进行交互 . 当然,您需要提供您的具体数据而不是suggeseted数据 .

    enter image description here

相关问题