복붙노트

[PYTHON] 특정 투영법을 사용할 때 Basemap.contour ()가있는 IndexError

PYTHON

특정 투영법을 사용할 때 Basemap.contour ()가있는 IndexError

특정 예상과 함께 Basemap.contour를 사용할 때 문제가 발생했습니다. Basemap 문서에 나와있는 예제를 기반으로 예상 된 결과를 생성하는 다음 작업 코드를 만들었습니다. 이 예제에서는 'tmerc'프로젝션을 사용합니다.

from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
import numpy as np


m2 = Basemap(projection='tmerc', 
              lat_0=0, lon_0=3,
              llcrnrlon=1.819757266426611, 
              llcrnrlat=41.583851612359275, 
              urcrnrlon=1.841589961763497, 
              urcrnrlat=41.598674173123)
##m2 = Basemap(projection='kav7',lon_0=0)

x = np.linspace(0, m2.urcrnrx, 100)
y = np.linspace(0, m2.urcrnry, 100)
xx, yy = np.meshgrid(x, y)
data = np.sin(xx/100)*np.cos(yy/100)

levels = np.linspace(-1,1,8)
m2.contour(xx, yy, data, levels)

plt.show()

그러나 대체 m2 = Basemap 선언 (예제 코드에서 주석 처리 된)에서 'kav7'프로젝션을 사용하도록 전환하면 코드가 다음 오류와 함께 실패합니다.

Traceback (most recent call last):
  File "basemap_contour.py", line 20, in <module>
    m2.contour(xx, yy, data, levels)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/mpl_toolkits/basemap/__init__.py", line 521, in with_transform
    return plotfunc(self,x,y,data,*args,**kwargs)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/mpl_toolkits/basemap/__init__.py", line 3542, in contour
    xx = x[x.shape[0]/2,:]
IndexError: only integers, slices (`:`), ellipsis (`...`), numpy.newaxis (`None`) and integer or boolean arrays are valid indices

이것은 lon과 lat 값을 '적절하게'정의 할 때도 발생합니다. 예제는 가능한 한 짧게 선택했습니다. 아무도이 문제를 해결하는 방법을 알고 있습니까?

편집하다:

이 경우에는 필자는 osx Sierra 컴퓨터에서 Python 버전 3.5.3을 사용하고 있습니다. matplotlib 버전은 2.0.0이고 basemap 버전은 1.0.7입니다.

해결법

  1. ==============================

    1.이 동작은 python3 정수 나누기에 따른 것입니다. 예를 찾으십시오.

    이 동작은 python3 정수 나누기에 따른 것입니다. 예를 찾으십시오.

    1) python3 :

    n=100
    print (n/2, (n+1)/2)
    

    출력 : 50.0 50.5

    2) 파이썬 2.7의 경우이 코드는 50 50을 반환합니다.

    솔루션 :

    1) python3을위한 나눗셈으로 basemap의 contour 및 contourf 함수를 수동으로 업데이트하십시오.

    정수 n : n // 2는 python2에서 나누기를 적용해야합니다.

    2) 또는 python2로 프로그램을 실행하십시오.

  2. ==============================

    2.이 문제에 대한 간단한 해결 방법을 발견했습니다. Basemap.contour를 호출하는 대신 Basemap의 Axes 인스턴스에서 직접 등고선을 호출 할 수 있습니다.

    이 문제에 대한 간단한 해결 방법을 발견했습니다. Basemap.contour를 호출하는 대신 Basemap의 Axes 인스턴스에서 직접 등고선을 호출 할 수 있습니다.

    from mpl_toolkits.basemap import Basemap
    import matplotlib.pyplot as plt
    import numpy as np
    
    fig,ax = plt.subplots()
    m2 = Basemap(projection='kav7',lon_0=0, ax=ax)
    
    x = np.linspace(0, m2.urcrnrx, 100)
    y = np.linspace(0, m2.urcrnry, 100)
    
    xx, yy = np.meshgrid(x, y)
    lon,lat = m2(xx,yy, inverse = True)
    
    data = np.sin(np.pi*lon/180)*np.cos(np.pi*lat/90)
    m2.drawcoastlines(linewidth=0.5)
    
    levels = np.linspace(-1,1,8)
    ##m2.contour(xx, yy, data, levels)
    ax.contour(xx,yy,data,levels)
    plt.show()
    

    이것은 파이썬 2.7과 3.6 모두에서 다음 그림을 생성합니다 :

  3. ==============================

    3.이 버그는 2 년 전에 고쳐졌으며 python 2 또는 3의 사용과 관계없이 basemap version> = 1.1.0에서는 발생하지 않습니다.

    이 버그는 2 년 전에 고쳐졌으며 python 2 또는 3의 사용과 관계없이 basemap version> = 1.1.0에서는 발생하지 않습니다.

  4. from https://stackoverflow.com/questions/44519804/indexerror-with-basemap-contour-when-using-certain-projections by cc-by-sa and MIT license