2016-11-02 4 views
0

예기치 않은 결과가 scipy.interpolate.griddata에서 발생합니다. 나는 matplotlib.basemapscipy.interpolate.griddata을 사용하여 불규칙한 간격의 점들을 시각화하려고 노력 중이다.interpolate.griddata가 북쪽으로 데이터를 이동합니다. 버그입니까?

데이터는 위도, 경도 및 값의 세 가지 목록으로 제공됩니다. 맵에서 그들을 얻으려면 데이터를 일반 그리드에 보간하고 Basemap의 imshow 함수를 사용하여 시각화합니다.

보간 된 데이터가 실제 위치에서 북쪽으로 시프트됨을 확인했습니다.

다음은 예입니다. 여기서 저는 두 개의 자오선과 두 개의 평행선에 의해 형성된 세포를 강조하고 싶습니다. 나는 이런 식으로 뭔가를 얻을 것으로 예상 :

observed image

당신은 빨간색 사각형이 눈에 띄게 북쪽으로 이동되는 것을 볼 수 있습니다

expected image

그러나 내가 얻을 것은이 같은 것입니다.

그리드 해상도와 포인트 수를 변경하려고 시도했지만,이 관찰 된 시프트에는 영향을 미치지 않습니다.

다음은이 문제를 설명하는 IPython notebook입니다.

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

# defining the region of interest 
r = {'lon':[83.0, 95.5], 'lat':[48.5,55.5]} 
# initializing Basemap 
m = Basemap(projection='merc', 
      llcrnrlon=r['lon'][0], 
      llcrnrlat=r['lat'][0], 
      urcrnrlon=r['lon'][1], 
      urcrnrlat=r['lat'][1], 
      lon_0=r['lon'][0], 
      ellps='WGS84', 
      fix_aspect=True, 
      resolution='h') 
# defining the highlighted block 
block = {'lon':[89,91],'lat':[50.5,52.5]} 
# generating the data 
npixels = 100000 
lat_range = r['lat'][1] - r['lat'][0] 
lats = lat_range * random.random(npixels) + r['lat'][0] 
lon_range = r['lon'][1] - r['lon'][0] 
lons = lon_range * random.random(npixels) + r['lon'][0] 
values = np.zeros(npixels) 
for p in range(npixels): 
    if block['lat'][0] < lats[p] < block['lat'][1] \ 
    and block['lon'][0] < lons[p] < block['lon'][1]: 
     values[p] = 1.0 
# plotting the original data without interpolation 
plt.figure(figsize=(5, 5)) 
m.drawparallels(np.arange(r['lat'][0], r['lat'][1] + 0.25, 2.0), 
        labels=[True,False,True,False]) 
m.drawmeridians(np.arange(r['lon'][0], r['lon'][1] + 0.25, 2.0), 
        labels=[True,True,False,True]) 
m.scatter(lons,lats,c=values,latlon=True,edgecolors='none') 
# interpolating on the regular grid 
nx = ny = 500 
mapx = np.linspace(r['lon'][0],r['lon'][1],nx) 
mapy = np.linspace(r['lat'][0],r['lat'][1],ny) 
mapgridx,mapgridy = np.meshgrid(mapx,mapy) 
mapdata = interpolate.griddata(list(zip(lons,lats)),values, 
        (mapgridx,mapgridy),method='nearest') 
# plotting the interpolated data 
plt.figure(figsize=(5, 5)) 
m.drawparallels(np.arange(r['lat'][0], r['lat'][1] + 0.25, 2.0), 
        labels=[True,False,True,False]) 
m.drawmeridians(np.arange(r['lon'][0], r['lon'][1] + 0.25, 2.0), 
        labels=[True,True,False,True]) 
m.imshow(mapdata) 

내가 answered the question bugtracker SciPy에 SciPy 0.17.0

답변

0

파울리 비르 타넨에이 메시지가 표시되는 :

또한 아래의 전체 코드입니다. 하나 matplotlib.pyplot.pcolormesh()

이미지가 올바르게 정렬 낸다

meshx,meshy = m(mapx,mapy) 
plt.pcolormesh(meshx,meshy,mapdata) 

으로

m.imshow(mapdata) 

위에 장착 basemap.imshow()으로 대체하는 경우

문제가 사라진다.

enter image description here

내가 basemap.imshow으로 잘못하고있는 무슨 분명하지 않다,하지만 그건 아마 또 다른 문제이다.