Jupyter Notebookを使用して、データセットの分析を行います。ノートブックには多くのプロットがあり、そのうちのいくつかは3Dプロットです。
3Dプロットをインタラクティブにすることが可能かどうか疑問に思っているので、後でそれをさらに詳しく試すことができますか?
ボタンを追加できますか?クリックすると3Dプロットが表示され、ズーム、パン、回転などができます。
私の考え:
3Dプロットの後にプロットを続行する必要があるため、これは私の場合に当てはまりません。 %qt
は、後のプロットに干渉します。
mpld3
は、私の場合、ほぼ理想的であり、matplotlibと互換性のある、何も書き換える必要はありません。ただし、2Dプロットのみをサポートしています。また、3Dで機能する計画はありませんでした( https://github.com/mpld3/mpld3/issues/22 )。
bokeh
ギャラリーで3Dプロットの実際の例を見つけられませんでした。 https://demo.bokehplots.com/apps/surface3d のみが見つかり、visjs
を使用します。
私が必要とするのは単なる行とデータなので、ブラウザでjsを使用してjsプロットにデータを渡してインタラクティブにすることは可能ですか? (それから3D軸も追加する必要があるかもしれません。)これはvisjs
およびmpld3
に似ているかもしれません。
試してください:
%matplotlib notebook
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の reply ;に注意してください。私見 ipyvolume は実に非常に印象的です(そして便利です!)。
ipyvolume と呼ばれる新しいライブラリがあり、それはあなたが望むことをするかもしれません ドキュメントはライブデモを示しています 。現在のバージョンはメッシュとラインを実行しませんが、gitレポのマスターは実行します(バージョン0.4と同様)。 (免責事項:私は著者です)
Plotly libraryを使用できます。 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にプロットされ、それとやり取りできるようになります。もちろん、提案されたデータではなく、特定のデータを提供する必要があります。
Plotly はこのリストにありません。 pythonバインディングページをリンクしました。アニメーション化されたインタラクティブな3Dチャートが決定的に含まれています。また、オープンソースであるため、そのほとんどはオフラインで利用できます。もちろん、Jupyterと連携しています
私が思いついた解決策は、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))