在已知 X 和 Y 坐标(各 1 列)处使用 Z 值(1 列)平滑 2D 插值图

Smooth 2D interpolation map using Z values (1 column) at known X and Y coordinates (1 column each)

请原谅我的无知,但不知何故,所有插值、平滑 2D 地图解决方案都需要关系 Z~f(x,y) 并且不适合我的问题。这最接近我的问题:smoothing surface plot from matrix

我有三列相同的长度:X 坐标、Y 坐标和 Z 值

我可以绘制这样的散点图

以 Z 作为填充物/颜色图,但它看起来像网格上具有规则间隔的点。

我想对它们进行插值和平滑以填充网格点之间的间隙,但我不知道 Z~f(x,y) 是什么。有办法实现吗?

更新 感谢@Wombatz 的插值(见下面的解决方案)。我已经将他的贡献添加到我的代码中,并弄清楚了如何将一维数组 Z-col 重新采样为适合我的 (x,y) 数组的二维数组。我的代码如下:

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

x = [0,0,1,1,2,2] #1D
y = [0,1,0,1,0,1] #1D
Z = [1,2,3,4,5,6] #1D

extent = (min(x), max(x), min(y), max(y))
xs,ys = np.mgrid[extent[0]:extent[1]:3j, extent[2]:extent[3]:2j] #2D x,y
Z_resampled = griddata((x, y), Z, (xs, ys)) #2D z


imshow(z_resampled, interpolation="gaussian", extent=extent, origin="lower")

x、y、z 的散点图:

我的代码给了我这个:

我假设您有以下数据:

  • x:x 值 [-120, -100, ..., 140, 160]
  • y: y 值 [-180, -160, ..., 80, 100]
  • z:包含网格中每个点的 z 值的二维数组

现在您可以将数据绘制为图像,为您进行插值:

from matplotlib.pyplot import imshow

extent = [x.min(), x.max(), y.min(), y.max()]
imshow(z, interpolation="none", extent=extent, origin="lower")

extent 定义图像的轴。您可以使用 interpolation 参数。

黑色圆圈是散点图中的标记(代码中未显示)。

如果您需要散点图标记位于每个像素的中心,您必须像这样更改 extent

ox = (x.max() - x.min()) / (x.size * 2)
oy = (y.max() - y.min()) / (y.size * 2)
extent = [x.min() - ox, x.max() + ox, y.min() - oy, y.max() + oy]

bilinear 插值一起看起来如下: