2013-04-24 1 views
11

좌표 변환의 2 차원지도가 있습니다. 각 점의 데이터는 0에서 360까지의 원래 좌표계에서의 축 각도입니다. pyplot.contour를 사용하여 일정한 각도의 선을 그려 봅니다. 45도. 윤곽선은 두 극 사이의 45도 선을 따라 표시되지만, 0/360 불연속 점을 따라 두 극을 연결하는 등고선에 추가 부분이 있습니다. 이것은 기본적으로 한쪽에는 0에 가까운 숫자를, 다른 한쪽에는 360에 가까운 숫자를 가진 픽셀을 추적하기 때문에 매우 들쭉날쭉 한 추한 선을 만듭니다.불연속성을 따라 등고선 그리기에서 pyplot.contour를 중지하십시오.

예 : colour map with discontinuity

당신이 왼쪽에있는 파란색/빨간색 곡선을 따라 불연속을 볼 수 여기에 풀 컬러 맵을 사용하여 이미지입니다. 한면은 360도이고 다른면은 0도입니다. 모든 윤곽이 두 기둥을 연결하는 것이

contour plot with discontinuity

참고하지만, 비록 나는 다른 모든 윤곽 pyplot 때문에 (0도 불연속를 따라, 0도 윤곽을 그려하지 않은 : 윤곽을하려 할 때, 나는 얻을 한면이 0, 다른면이 360이라고 생각하면 사이에 다른 모든 각도가 있어야합니다.)

import numpy as np 
import matplotlib.pyplot as plt 
jgal = np.array([[-0.054875539726,-0.873437108010,-0.483834985808],\ 
       [0.494109453312,-0.444829589425, 0.746982251810],\ 
       [-0.867666135858,-0.198076386122, 0.455983795705]]) 

def s2v3(rra, rdec, r): 
    pos0 = r * np.cos(rra) * np.cos(rdec) 
    pos1 = r * np.sin(rra) * np.cos(rdec) 
    pos2 = r * np.sin(rdec) 
    return np.array([pos0, pos1, pos2]) 

def v2s3(pos): 
    x = pos[0] 
    y = pos[1] 
    z = pos[2] 
    if np.isscalar(x): x, y, z = np.array([x]), np.array([y]), np.array([z]) 
    rra = np.arctan2(y, x) 
    low = np.where(rra < 0.0) 
    high = np.where(rra > 2.0 * np.pi) 
    if len(low[0]): rra[low] = rra[low] + (2.0*np.pi) 
    if len(high[0]): rra[high] = rra[high] - (2.0*np.pi) 
    rxy = np.sqrt(x**2 + y**2) 
    rdec = np.arctan2(z, rxy) 
    r = np.sqrt(x**2 + y**2 + z**2) 
    if x.size == 1: 
     rra = rra[0] 
     rdec = rdec[0] 
     r = r[0] 
    return rra, rdec, r 


def gal2fk5(gl, gb): 
    dgl = np.array(gl) 
    dgb = np.array(gb) 
    rgl = np.deg2rad(gl) 
    rgb = np.deg2rad(gb) 
    r = 1.0 
    pos = s2v3(rgl, rgb, r) 

    pos1 = np.dot(pos.transpose(), jgal).transpose() 

    rra, rdec, r = v2s3(pos1) 

    dra = np.rad2deg(rra) 
    ddec = np.rad2deg(rdec) 

    return dra, ddec 


def make_coords(resolution=50): 
    width=9 
    height=6 
    px = width*resolution 
    py = height*resolution 
    coords = np.zeros((px,py,4)) 
    for ix in range(0,px): 
     for iy in range(0,py): 
      l = 360.0/px*ix - 180.0 
      b = 180.0/py*iy - 90.0 
      dra, ddec = gal2fk5(l,b) 
      coords[ix,iy,0] = dra 
      coords[ix,iy,1] = ddec 
      coords[ix,iy,2] = l 
      coords[ix,iy,3] = b 
    return coords 

coords = make_coords() 

# now do one of these 
#plt.imshow(coords[:,:,0],origin='lower') # color plot 
#plt.contour(coords[:,:,0],levels=[45,90,135,180,225,270,315]) # contour plot with jagged ugliness 

나도 어떻게 : 불연속 함께

  • 메이크업을 윤곽을 그리기에서

    1. 정지 pyplot.contour 인식 pyplot.contour

      코드는이 데이터를 생성하는 각도의 0/360 불연속 점이 전혀 실제 불연속이 아님을 알 수 있습니다.

    나는 기초적인 데이터의 해상도를 높일 수 있지만 멋진 부드러운 선을 만들기 전에 매우 긴 시간과 많은 양의 플로팅을 시작합니다.

    0도를 따라 등고선을 그려보고 싶지만 불연속성을 숨기는 방법을 알아낼 수 있다면 윤곽선이 아닌 다른 곳으로 이동할 수 있습니다. 또는 # 2를 만들 수 있다면 문제가되지 않습니다.

  • +2

    문제 플롯의 이미지 또는 (단순화 된 버전을 생성하는 몇 가지 예제 코드를 게시 할 수 있다면 도움이됩니다. – askewchan

    +0

    방금 ​​문제를 설명하기 위해 예제 플롯을 추가했습니다. – GJP

    +1

    이것은 윤곽선을 이상하게 사용하는 것으로, 원하는 방식으로 작동하도록 만들지 않을 것이라고 생각합니다. 그러나 나는 당신이 윤곽선 이외의 것을 사용하여 원하는 줄거리를 얻을 수 있다고 확신합니다. 'imshow'를 사용하면 여러분의 최상위 플롯과 같은 것을 얻을 수 있으며'streamplot'은 여러분에게 가장 가까운 플롯과 가까운 것을 줄 것입니다. 어떤 음모가 궁극적으로 원하는 것과 가까운가? 데이터 필드를 생성하는 함수를 제공 할 수 있습니까? – Paul

    답변

    1

    이 아직 확실히 해킹,하지만 당신은 두 가지 방법으로 좋은 부드러운 윤곽을 얻을 수 있습니다 : 위상의 절대 값의

    1. 플롯 윤곽 (에서 -180˚ 180˚로 이동) 불연속이 없도록한다. 한정된 지역에서 윤곽의
    2. 플롯 두 세트 꼭대기와 극값의 바닥에 가까운 수치 결함에 크리프하지 않도록 여기에

    이 예에 추가 할 전체 코드입니다.

    Z = np.exp(1j*np.pi*coords[:,:,0]/180.0) 
    Z *= np.exp(0.25j*np.pi/2.0) # Shift to get same contours as in your example 
    X = np.arange(300) 
    Y = np.arange(450) 
    
    N = 2 
    levels = 90*(0.5 + (np.arange(N) + 0.5)/N) 
    c1 = plt.contour(X, Y, abs(np.angle(Z)*180/np.pi), levels=levels) 
    c2 = plt.contour(X, Y, abs(np.angle(Z*np.exp(0.5j*np.pi))*180/np.pi), levels=levels) 
    

    Smooth contour plot of phase angle

    하나는 "주기"기능에 대한 부드러운 윤곽을 얻을 수있는이 코드를 일반화 할 수 있습니다.이제 할 일은 정확한 값이 인 새 윤곽선 을 생성하여 색상 맵을 올바르게 적용하고 레이블을 올바르게 적용하는 것입니다. 그러나 matplotlib를 사용하면이 작업을 수행 할 수있는 간단한 방법이없는 것처럼 보입니다. 관련 QuadContourSet 클래스는 모든 작업을 수행하며 윤곽선 인 c1c2에서 적절한 등고선 오브젝트를 생성하는 간단한 방법은 없습니다.