주피터 노트북에서 3D 그림을 대화식으로 만들기
저는 데이터셋 분석을 위해 주피터 노트북을 사용합니다.공책에는 많은 플롯이 있고, 그 중에는 3D 플롯도 있습니다.
나중에 좀 더 자세히 가지고 놀 수 있도록 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
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)
결과적으로 주피터 노트북에 다음 차트가 표시되고 상호 작용할 수 있습니다.물론 제안된 데이터 대신에 구체적인 데이터를 제공해야 합니다.
원하는 것을 할 수 있는 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
'programing' 카테고리의 다른 글
.NET에서 개체를 UTF-8 XML로 직렬화 (0) | 2023.10.02 |
---|---|
약한 심볼을 덮어쓰기 위해 정적 라이브러리에서 gcc 링크 강한 심볼을 만드는 방법? (0) | 2023.10.02 |
Wordpress SQL 사용자 지정 게시물 유형 및 메타 삭제 (0) | 2023.10.02 |
워드프레스에서 $_POST 사용방법 (0) | 2023.10.02 |
Wordpress 3.0에서 Custom post_type Permalinks에서 날짜 사용 (0) | 2023.10.02 |