落入网格物体外部的数据点被插值,而网格物体肯定覆盖了这些点

问题描述 投票:1回答:1

我正在尝试在网格上插值稀疏数据,但观察到一些相当奇怪的行为。白点恰好是我具有值的位置,并且我依靠线性插值算法在可能的情况下填充其他网格。我认识到,由于明显缺乏数据,这种插值方法并不完美,但是为什么我拥有数据的某些点落在我要插值的网格网格之外?这是普遍现象吗?即使我使网格更粗,这也不会改变。

我将对为什么会发生这种现象(或线性插值如何工作)或是否有解决此问题的方法有所了解。例如,请参见下面图片中的红色圆圈:enter image description here为插值提供的数据点落在插值到的网格上方

以下是关于生成网格数据的插值的一些代码。

#mesh grid
xg = np.linspace(-130, -60, num=70)
yg = np.linspace(20,50,num=30)
Xg,Yg = np.meshgrid(xg,yg)

zg1 = griddata(points1, df2['tempratio'], (Xg, Yg), method = 'linear')

from mpl_toolkits.basemap import Basemap

lon_0 = xg.mean()
lat_0 = yg.mean()

m = Basemap(width=5000000, height=3500000,
           resolution='l', projection='stere',\
           lat_ts=40, lat_0=lat_0, lon_0=lon_0)

xm, ym = m(Xg, Yg)

cs = m.pcolormesh(xm,ym,zg1,shading='flat',cmap=plt.cm.Reds)
python matplotlib interpolation matplotlib-basemap linear-interpolation
1个回答
0
投票

griddata将值分配给网格的顶点,因此70x30点。 pcolormesh不为顶点着色,而是中间的矩形。给定的顶点仅形成69x29个矩形。因此,将删除zg1的一行和一列。为了解决这个问题,可以在坐标中添加额外的行和额外的列,并在每个方向上将所有内容移动半个矩形。

这里有一些代码来说明正在发生的事情:

import numpy as np
from scipy.interpolate import griddata
from matplotlib import pyplot as plt

def extend_range(x):
    dx = (x[1] - x[0]) / 2
    return np.append( x - dx, x[-1] + dx)

N = 10
points1 = np.vstack([np.random.randint(-130, -60, N), np.random.randint(20, 50, N)]).T
tempratio = np.random.randint(0, 20, N)

xg = np.linspace(-130, -60, num=15)
yg = np.linspace(20, 50, num=10)
Xg, Yg = np.meshgrid(xg, yg)

zg1 = griddata(points1, tempratio, (Xg, Yg), method='linear')

fig, axs = plt.subplots(ncols=2, figsize=(12, 4))
for ax in axs:
    ax.scatter(Xg, Yg, c=zg1, cmap='coolwarm', ec='g', s=80, zorder=2, label='griddata')
    ax.scatter(points1[:,0], points1[:,1], c=tempratio, cmap='coolwarm', ec='black', s=150, zorder=3, label='given data')

    if ax == axs[0]:
        ax.pcolormesh(xg, yg, zg1, shading='flat', cmap='coolwarm')
        ax.set_title('given x and y ranges')
    else:
        #todo: convert xg and yg to map coordinates
        ax.pcolormesh(extend_range(xg), extend_range(yg), zg1, shading='flat', cmap='coolwarm')
        ax.set_title('extended x and y ranges')
    ax.legend()
plt.show()
© www.soinside.com 2019 - 2024. All rights reserved.