web-dev-qa-db-ja.com

Python&Matplotlib:Jupyter Notebookで3Dプロットをインタラクティブにする

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/22 )。

3.ボケ+ visjs

bokehギャラリーで3Dプロットの実際の例を見つけられませんでした。 https://demo.bokehplots.com/apps/surface3d のみが見つかり、visjsを使用します。

4. Javascript 3Dプロット?

私が必要とするのは単なる行とデータなので、ブラウザでjsを使用してjsプロットにデータを渡してインタラクティブにすることは可能ですか? (それから3D軸も追加する必要があるかもしれません。)これはvisjsおよびmpld3に似ているかもしれません。

46
cqcn1991

試してください:

%matplotlib notebook

jakevdp reply here を参照

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 は実に非常に印象的です(そして便利です!)。

57
eldad-a

ipyvolume と呼ばれる新しいライブラリがあり、それはあなたが望むことをするかもしれません ドキュメントはライブデモを示しています 。現在のバージョンはメッシュとラインを実行しませんが、gitレポのマスターは実行します(バージョン0.4と同様)。 (免責事項:私は著者です)

11

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にプロットされ、それとやり取りできるようになります。もちろん、提案されたデータではなく、特定のデータを提供する必要があります。

enter image description here

6

Plotly はこのリストにありません。 pythonバインディングページをリンクしました。アニメーション化されたインタラクティブな3Dチャートが決定的に含まれています。また、オープンソースであるため、そのほとんどはオフラインで利用できます。もちろん、Jupyterと連携しています

4
geniusupgrader

私が思いついた解決策は、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
brm

3D視覚化の場合は、 pythreejs をノートブックに入れるのが最善の方法です。ノートブックのインタラクティブなウィジェットインフラストラクチャを活用するため、JSとpython間の接続はシームレスです。

より高度なライブラリは bqplot で、これはiPythonノートブック用のd3ベースのインタラクティブvizライブラリですが、2Dのみを実行します

2
Drew