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

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



답변

“카메라 위치”는 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)


답변

편리한 것은 카메라 위치를 새로운 플롯에 적용하는 것입니다. 그래서 나는 음모를 꾸미고 마우스로 거리를 바꾸면서 음모를 움직입니다. 그런 다음 다른 플롯의 거리를 포함하여 뷰를 복제하십시오. 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])     #...


답변