python / matplotlib을 사용하여 3D 플롯에 대한 "카메라 위치"를 설정하는 방법은 무엇입니까?


134

mplot3d를 사용하여 멋진 3D 데이터 플롯을 생성하는 방법을 배우고 있으며 지금까지 매우 기쁩니다. 내가 지금하려고하는 것은 회전하는 표면의 작은 애니메이션입니다. 이를 위해 3D 투영을위한 카메라 위치를 설정해야합니다. matplotlib을 대화 형으로 사용할 때 마우스를 사용하여 표면을 회전 할 수 있기 때문에 이것이 가능해야한다고 생각합니다. 그러나 스크립트에서 어떻게 할 수 있습니까? mpl_toolkits.mplot3d.proj3d에서 많은 변환을 찾았지만 내 목적으로 사용하는 방법을 찾을 수 없었으며 내가하려는 일에 대한 예를 찾지 못했습니다.


2
Jupyter 노트북에서 대화식으로 회전하는 방법을 궁금해하는 사람들을위한 참고 사항 : 사용 가능%matplotlib notebook
YvesgereY

마우스 오른쪽 버튼을 누른 상태에서 드래그하면 카메라 거리가 변경됩니다.
LoMaPh

이런 종류의 vizualisations, 나는 mayavi를 시도 할 것입니다.
Tactopoda 2016 년

답변:


158

"카메라 위치"는 3D 플롯을 보는 데 사용하는 고도 및 방위각을 조정하려는 것처럼 들립니다. 로 설정할 수 있습니다 ax.view_init. 아래 스크립트를 사용하여 먼저 플롯을 만든 다음 적절한 높이 또는를 결정하여 elev플롯을 볼 수 있습니다. 그런 다음 방위각 또는을 조정하여 azim플롯 주위의 360도 전체를 변경하여 각 인스턴스에서 그림을 저장하고 플롯을 저장할 때 방위각을 기록합니다. 보다 복잡한 카메라 팬의 경우 원하는 효과를 얻기 위해 고도와 각도를 모두 조정할 수 있습니다.

    from mpl_toolkits.mplot3d import Axes3D
    ax = Axes3D(fig)
    ax.scatter(xx,yy,zz, marker='o', s=20, c="goldenrod", alpha=0.6)
    for ii in xrange(0,360,1):
        ax.view_init(elev=10., azim=ii)
        savefig("movie%d.png" % ii)

26
날 이길! 참고로 이들은 ax.elevax.azim속성으로 사용할 수 있습니다. 당신은 또한 단지 쓴 수 ax.azim = ii또는 ax.azim += 1같은 효과를 얻을 수 있습니다.
Joe Kington

1
당신을 이길 수는 있지만 공정한 포인트가 있습니다. 이것은 또한 단지 코딩 발췌 부분이며, for_loop 내에 view_init 및 savefig보다 더 많았습니다. =)
코스모스

4
고마운 우주와 조, 내가 찾던 것이 바로 그 것이었다. 이제 무엇을 찾아야하는지 알았으므로 ax.dist와 ax.azim 및 ax.elev와 함께 카메라 좌표를 극좌표로 설정할 수 있습니다.
Andreas Bleuler

이것이 답이라면 체크 표시를 해주시겠습니까? 감사.
cosmosis

12
ax.dist = 15 (기본값은 10)
Tim

14

편리한 것은 카메라 위치를 새로운 플롯에 적용하는 것입니다. 그래서 나는 음모를 꾸미고 마우스로 거리를 바꾸면서 음모를 움직입니다. 그런 다음 다른 플롯의 거리를 포함하여 뷰를 복제하십시오. axx.ax.get_axes ()는 오래된 .azim과 .elev를 가진 객체를 얻습니다.

PYTHON에서 ...

axx=ax1.get_axes()
azm=axx.azim
ele=axx.elev
dst=axx.dist       # ALWAYS GIVES 10
#dst=ax1.axes.dist # ALWAYS GIVES 10
#dst=ax1.dist      # ALWAYS GIVES 10

나중에 3D 그래프 ...

ax2.view_init(elev=ele, azim=azm) #Works!
ax2.dist=dst                       # works but always 10 from axx

편집 1 ... 좋아, 카메라 위치는 .dist 값에 대한 잘못된 생각입니다. 그것은 전체 그래프에 대해 일종의 해커 스칼라 멀티 플라이어로 모든 것을 타고갑니다.

이것은보기의 확대 / 축소에 효과적입니다.

xlm=ax1.get_xlim3d() #These are two tupples
ylm=ax1.get_ylim3d() #we use them in the next
zlm=ax1.get_zlim3d() #graph to reproduce the magnification from mousing
axx=ax1.get_axes()
azm=axx.azim
ele=axx.elev

나중에 그래프 ...

ax2.view_init(elev=ele, azim=azm) #Reproduce view
ax2.set_xlim3d(xlm[0],xlm[1])     #Reproduce magnification
ax2.set_ylim3d(ylm[0],ylm[1])     #...
ax2.set_zlim3d(zlm[0],zlm[1])     #...

해키 스칼라 곱셈을 불러 내기 위해 +1. 원근법을 원한다면 매우 성가신 일입니다.
user5920660
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.