예기치 않은 결과가 scipy.interpolate.griddata
에서 발생합니다. 나는 matplotlib.basemap
과 scipy.interpolate.griddata
을 사용하여 불규칙한 간격의 점들을 시각화하려고 노력 중이다.interpolate.griddata가 북쪽으로 데이터를 이동합니다. 버그입니까?
데이터는 위도, 경도 및 값의 세 가지 목록으로 제공됩니다. 맵에서 그들을 얻으려면 데이터를 일반 그리드에 보간하고 Basemap의 imshow
함수를 사용하여 시각화합니다.
보간 된 데이터가 실제 위치에서 북쪽으로 시프트됨을 확인했습니다.
다음은 예입니다. 여기서 저는 두 개의 자오선과 두 개의 평행선에 의해 형성된 세포를 강조하고 싶습니다. 나는 이런 식으로 뭔가를 얻을 것으로 예상 :
당신은 빨간색 사각형이 눈에 띄게 북쪽으로 이동되는 것을 볼 수 있습니다
그러나 내가 얻을 것은이 같은 것입니다.
그리드 해상도와 포인트 수를 변경하려고 시도했지만,이 관찰 된 시프트에는 영향을 미치지 않습니다.
다음은이 문제를 설명하는 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