我观察到来自scipy.interpolate.griddata
的意外结果。我正在尝试使用matplotlib.basemap
和scipy.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)
我用SciPy 0.17.0
看到了这一点答案 0 :(得分:0)
Pauli Virtanen关于SciPy bugtracker answered the question。
如果用basemap.imshow()
替换matplotlib.pyplot.pcolormesh()
替换上面的
m.imshow(mapdata)
与
meshx,meshy = m(mapx,mapy)
plt.pcolormesh(meshx,meshy,mapdata)
生成正确对齐的图像。
目前尚不清楚我在basemap.imshow
做错了什么,但这可能是另一个问题。