interpolate.griddata向北移动数据,这是一个错误吗?

时间:2016-11-02 10:37:04

标签: python scipy geospatial matplotlib-basemap imshow

我观察到来自scipy.interpolate.griddata的意外结果。我正在尝试使用matplotlib.basemapscipy.interpolate.griddata来显示一组不规则间隔的点。

数据以三个列表给出:纬度,经度和价值。为了将它们放在地图上,我将数据插入到规则网格中,并使用Basemap的imshow函数对其进行可视化。

我观察到插值数据从真实位置向北移动。

这是一个例子。在这里,我想强调一个由两条经线和两条平行线组成的细胞。我希望得到这样的东西:

expected image

然而我得到的是这样的:

observed 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)

我用SciPy 0.17.0

看到了这一点

1 个答案:

答案 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)

生成正确对齐的图像。

enter image description here

目前尚不清楚我在basemap.imshow做错了什么,但这可能是另一个问题。