programing

주피터 노트북에서 3D 그림을 대화식으로 만들기

newsource 2023. 10. 2. 15:03

주피터 노트북에서 3D 그림을 대화식으로 만들기

저는 데이터셋 분석을 위해 주피터 노트북을 사용합니다.공책에는 많은 플롯이 있고, 그 중에는 3D 플롯도 있습니다.

enter image description here

나중에 좀 더 자세히 가지고 놀 수 있도록 3d 플롯을 인터랙티브하게 만드는 것이 가능한지 궁금합니다.

버튼을 추가할 수도 있을까요?클릭하면 3D 플롯이 튀어나오고 사람들이 확대, 이동, 회전 등을 할 수 있습니다.


나의 생각:

1. 매트플롯 리브, %qt

3D 플롯 후에도 플롯을 계속해야 하기 때문에 제 경우에는 맞지 않습니다.%qt나중의 플롯을 방해합니다.

2. mpld3

mpld3제 경우에는 거의 이상적이고, 아무것도 다시 쓸 필요가 없고, 매트플롯리브와 호환됩니다.그러나 2D 그림만 지원합니다.그리고 저는 3D(https://github.com/mpld3/mpld3/issues/223) 에서 어떤 계획도 작동하는 것을 보지 못했습니다.

3. bokeh + visjs

3D 플롯의 실제 예시를 찾지 못했습니다.bokeh갤러리.나는 다음을 사용하는 https://demo.bokeh.org/surface3d, 만 찾습니다.visjs.

4. 자바스크립트 3D 플롯?

제가 필요한 것은 line and surce뿐이기 때문에 브라우저 내 js를 이용하여 js plot에 데이터를 전달하여 인터랙티브하게 할 수 있을까요? (그럼 3d축도 추가해야 할 수도 있습니다.)이는 다음과 유사할 수 있습니다.visjs,그리고.mpld3.

시도:

%matplotlib notebook

jakevdp 답변을 여기서 보세요.

JupyterLab 사용자를 위한 EDIT:

지침에 따라 주피터 매트플롯 리브를 설치합니다.

그러면 예제에서와 같이 위의 마법 명령이 더 이상 필요하지 않습니다.

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

마지막으로, Marten Breddels의 답변을 참고하십시오. IMHoipy 볼륨은 정말로 매우 인상적입니다(그리고 유용합니다!).

Plotly 라이브러리를 사용해도 좋습니다.주피터 노트북에서 직접 대화형 3D 플롯을 렌더링할 수 있습니다.

이렇게 하려면 먼저 다음을 실행하여 Plotly를 설치해야 합니다.

pip install plotly

다음을 실행하여 라이브러리를 업그레이드할 수도 있습니다.

pip install plotly --upgrade

이후 주피터 노트북에 다음과 같은 내용을 적을 수 있습니다.

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

결과적으로 주피터 노트북에 다음 차트가 표시되고 상호 작용할 수 있습니다.물론 제안된 데이터 대신에 구체적인 데이터를 제공해야 합니다.

enter image description here

원하는 것을 할 수 있는 ipy volume이라는 새로운 라이브러리가 있습니다. 설명서에는 실시간 데모가 나와 있습니다.현재 버전은 메쉬와 선을 하지 않지만 깃 레포의 마스터는 (버전 0.4와 마찬가지로) 수행합니다. (거부자:제가 저자입니다)

이 목록에 플롯리가 없습니다.파이썬 바인딩 페이지를 링크했습니다.확실히 애니메이션 및 상호작용적인 3D 차트를 가지고 있습니다.오픈 소스이기 때문에 대부분 오프라인에서 사용할 수 있습니다.물론 주피터와 함께 작동합니다.

제가 생각해낸 해결책은 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))

3-D 시각화를 위해서는 pythreejs가 가장 좋은 방법일 것입니다.노트북의 대화형 위젯 인프라를 활용하기 때문에 JS와 파이썬 간의 연결이 원활합니다.

더 발전된 라이브러리는 bq plot인데, bq plot은 iPython 노트북을 위한 d3 기반 대화형 viz 라이브러리입니다. 하지만 2D만 가능합니다.

음모를 꾸미는px.scatter_3d운 좋게 매트플롯리브로 열심히 노력한 끝에 찾은 3D 플롯 애니메이션 중 가장 간단한 해결책입니다 - 이 게시물에서 좋은 예를 찾을 수 있습니다:3D Plotly 산점도의 크기가 무작위로 변경되는 이유는 무엇입니까?

언급URL : https://stackoverflow.com/questions/38364435/make-3d-plot-interactive-in-jupyter-notebook