不能对 matplotlib griddata 函数使用线性插值

Cannot use linear interpolation with matplotlib griddata function

以下代码是我遇到问题的简化版本:

import matplotlib.pyplot as plt
from matplotlib.mlab import griddata
import numpy as np

def grid(x, y, z, resX=100, resY=100):
    xi = np.linspace(np.min(x), np.max(x), resX)
    yi = np.linspace(np.min(y), np.max(y), resY)
    #Z    = griddata(x, y, z, xi, yi)
    Z    = griddata(x, y, z, xi, yi, interp='linear')
    X, Y = np.meshgrid(xi, yi)
    return X, Y, Z

data = np.random.randint(200,size = (40,20))

X = np.arange(40)
Y = np.arange(20)

x, y = np.meshgrid(X, Y)
z = np.array(data)

X, Y, Z = grid(x.ravel(), y.ravel(), z.ravel(), resX=50, resY=50)

plt.figure()
plt.subplot(1,2,1)
plt.imshow(data)
plt.subplot(1,2,2)
plt.imshow(Z)
plt.show()

只要我用注释行

Z = griddata(x, y, z, xi, yi)

而不是

Z = griddata(x, y, z, xi, yi, interp='linear')

一切正常。一旦我用线性插值启动代码,我就会得到

raise ValueError("output grid must have constant spacing"
ValueError: output grid must have constant spacing when using interp='linear'

那么 np.linspace() 怎么可能不会产生恒定的间距或者我错过了什么? (显然,我的真实数据比示例中使用的数据复杂得多,而且分布不均,因此确实需要使用 griddata!)

升级到 matplotlib 1.4.3 和 numpy 1.9.2 就可以了。现在线性插值工作正常,但原来使用的自然邻域不再工作

raise RuntimeError("To use interp='nn' (Natural Neighbor "
RuntimeError: To use interp='nn' (Natural Neighbor interpolation) in griddata, natgrid must be installed.  Either install it from http://sourceforge.net/projects/matplotlib/files/matplotlib-toolkits, or use interp='linear' instead.

我通过

升级了(Ubuntu 14.04)
# Install libfreetype6-dev
sudo apt-get install libfreetype6-dev

# Upgrade to matplotlib 1.4 using PIP
sudo pip install --upgrade matplotlib

手动安装 natgrid (http://sourceforge.net/projects/matplotlib/files/matplotlib-toolkits/) 后,我所有的问题似乎都解决了!

@George:谢谢