我使用Jupyter Notebook来分析数据集。笔记本中有很多情节,其中一些是3d图。
我想知道是否有可能使3d绘图具有交互性,所以我稍后可以更详细地使用它?
也许我们可以在上面添加一个按钮?点击它可以弹出一个3d图,人们可以缩放,平移,旋转等。
我的想法:
这不适合我的情况,因为我需要在3d情节之后继续绘图。 %qt
会干扰以后的情节。
mpld3
几乎是理想的,不需要重写任何东西,与matplotlib兼容。但是,它只支持2D绘图。而且我没有看到任何有关3D的计划(https://github.com/mpld3/mpld3/issues/223)。
未在bokeh
图库中找到任何3d图的实际示例。我只找到使用visjs
的{{3}}。
因为我需要的只是直线和外观,是否可以使用浏览器中的js将数据传递给js plot以使其具有交互性? (然后我们可能还需要添加3d轴。)这可能类似于visjs
和mpld3
。
答案 0 :(得分:49)
尝试:
%matplotlib notebook
为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确实非常令人印象深刻(也很有用!)。
答案 1 :(得分:10)
有一个名为ipyvolume的新库可以执行您想要的操作the documentation shows live demos。当前版本不执行网格和线条,但是git repo中的master会执行(与版本0.4一样)。 (免责声明:我是作者)
答案 2 :(得分:4)
Plotly。 我已经链接了python绑定页面。它最终具有动画和交互式3D图表。由于它是开源的,因此大部分都可以离线使用。当然它正在与Jupyter合作
答案 3 :(得分:4)
我提出的解决方案是在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))
答案 4 :(得分:4)
您可以使用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 :(得分:2)