2014-11-07 5 views
2

Matplotlib을 사용하여 3D 표면 플롯으로 일부 데이터를 플로팅하고 있습니다. 사용중인 코드는 3D surface plot example과 매우 유사합니다.Matplotlib의 3D 표면 플롯에서 수직 Z 축을 얻는 방법은 무엇입니까?

enter image description here

이 플롯의 문제가 Z 축을 수직 없다는 것이다 : 이것은 아래의 플롯을 생성한다. Z 축을 수직으로 만드는 방법은 무엇입니까?

사용할 수있는 다른 API를 조사한 결과 view_init이 발견되었습니다. 아래와 같이 view_init을 사용하여 플롯 낮은 고도 (elev=1)를 설정함으로써, I는 Z 축을 수직으로 얻을 수

그러나 enter image description here

, 여기에서 문제가 있음을 둘러 고양 Y에서 축 눈금 레이블은 모두 덮어 쓰여서 제대로 볼 수 없습니다. 그래서 그림 1과 같이 X-Y 평면 회전 각이 높은 표고가 있어야합니다.이 플롯에서 수직 Z 축을 얻으려면 어떻게해야합니까?

Matlab을 잘 모르지만 Matplotlib는 Matlab API에서 파생 된 것입니다. 그래서, Matlab 문서의 표면 플롯 예제를 살펴본 결과, Z 축이 예제에서 수직으로 보인다는 것을 알았습니다. 높은 고도와 그림에 대한 하나의 그림은 다음과 같습니다

enter image description here

업데이트 1 : Bentoy13의 제안을 바탕으로, 나는 view_init(elev=30, azim=-37.5)을 설정하고 아래의 결과를 얻었다. 그것은 아직 수직 더 나은,하지만되지 않습니다 : 비교

enter image description here

은, matlab에 플롯 Z 축이 완벽하게 수직이다. 또한이 각도에서 볼 수 있듯이 일부 정보가 숨겨져 있으므로 실제로는 azim=-37.5을 사용할 수 없습니다. 다른 해결책? :-) Matlab의 설명서에 나와있는 예에서

+1

pertive projection/ortographc proyection 문제인 것처럼 보입니다 –

답변

2

는 표면 플롯 종종 명령 view 주어진다 특별한 위치에서 보았을되어

view(3) 

명령 view는 축의 시점을 설정한다. 다큐먼트에 따르면, view(3)은 방위각 = -37.5 및 고도 = 30

EDIT

는 축이 수직이 아닌 수직 Z 축를 갖는 문제가 있음과 기본 입체 뷰를 설정 , 그러나 원근법의 문제이다. 기본적으로 Matlab은 직교 투영으로 3D 서페이스를 플롯하지만, Matplotlib은 원근 투영으로 그려집니다. 슬프게도하기 matplotlib

편집 ...이 설정을위한 API를 제공하지 않습니다 2 다음과 같은 패치가 직교 투영에서 3D를 그리는 매우 유용 것으로 보인다

:

import numpy 
from mpl_toolkits.mplot3d import proj3d 
def orthogonal_proj(zfront, zback): 
    a = (zfront+zback)/(zfront-zback) 
    b = -2*(zfront*zback)/(zfront-zback) 
    return numpy.array([[1,0,0,0], 
         [0,1,0,0], 
         [0,0,a,b], 
         [0,0,0,zback]]) 
proj3d.persp_transformation = orthogonal_proj 

I 이 패치에 대한 크레디트가 없으면 here입니다.

+0

고마워요! 나는 그 설정을 시도하고 Z 축은 더 좋으며 거의 ​​수직이다. 나는 새로운 인물로 질문을 업데이트했다. Matlab 그림처럼 완벽하게 수직으로 만들 수있는 방법은 무엇입니까? 또한이 데이터에는 azim을 사용할 수 없습니다 :-) –

+0

@Ashwin 제 편집을 봅니다. 정육면 투영 [여기] (https://github.com/matplotlib/matplotlib/issues/537)으로 전환하는 코드 조각을 발견했지만 matplotlib에 익숙하지 않아 사용 방법을 모르겠습니다. 일단 당신이 당신의 표면 음모를 그렸으면. – Bentoy13

+0

Bentoy13 : 그게 효과가 있었어! 이 코드 스 니펫을 대답으로 다시 게시 할 수 있습니까? :-) –

관련 문제