<p>考虑:</p>
<pre><code>x = np.linspace(1., 10., 20)
y = np.linspace(1., 10., 20)
z = np.linspace(1., 2., 20)
</code></pre>
<p>这意味着我们知道直线<code>x=y</code>上某些点的z值。</p>
<p>从那里开始</p>
<pre><code>zi = ml.griddata(x,y,z,xi,yi)
</code></pre>
<p>要求<code>mlab.griddata</code>外推矩形网格中所有点的<code>z</code>值。</p>
<p>我们已经给出了很多关于<code>z</code>沿这条线如何变化的信息,但是没有关于<code>z</code>沿垂直方向(远离<code>x = y</code>线)如何变化的信息。由于<code>mlab.griddata</code>拒绝猜测,因此引发了一个错误。</p>
<p>如果初始的<code>x</code>,<code>y</code>数据分布更随机,您将获得更好的结果:</p>
<pre><code>import numpy as np
import matplotlib.pyplot as plt
import matplotlib.mlab as ml
ndata = 10
ny, nx = 100, 200
xmin, xmax = 1, 10
ymin, ymax = 1, 10
# x = np.linspace(1, 10, ndata)
# y = np.linspace(1, 10, ndata)
x = np.random.randint(xmin, xmax, ndata)
y = np.random.randint(ymin, ymax, ndata)
z = np.random.random(ndata)
xi = np.linspace(xmin, xmax, nx)
yi = np.linspace(ymin, ymax, ny)
zi = ml.griddata(x, y, z, xi, yi)
plt.contour(xi, yi, zi, 15, linewidths = 0.5, colors = 'k')
plt.pcolormesh(xi, yi, zi, cmap = plt.get_cmap('rainbow'))
plt.colorbar()
plt.scatter(x, y, marker = 'o', c = 'b', s = 5, zorder = 10)
plt.xlim(xmin, xmax)
plt.ylim(ymin, ymax)
plt.show()
</code></pre>
<p><img src="https://i.stack.imgur.com/tes2O.png" alt="enter image description here"/></p>
<hr/>
<p>如果希望<code>mlab.griddata</code>以任意方式将数据沿着<code>x=y</code>线外推到整个网格,可以添加两个额外的边界点<code>(xmin, ymax, z[0])</code>和<code>(xmax,ymin,z[-1])</code>:</p>
<pre><code>import numpy as np
import matplotlib.pyplot as plt
import matplotlib.mlab as ml
np.random.seed(8)
ndata = 10
ny, nx = 100, 200
xmin, xmax = 1, 10
ymin, ymax = 1, 10
x = np.linspace(1, 10, ndata)
y = np.linspace(1, 10, ndata)
z = np.random.random(ndata)
x = np.r_[x,xmin,xmax]
y = np.r_[y,ymax,ymin]
z = np.r_[z,z[0],z[-1]]
xi = np.linspace(xmin, xmax, nx)
yi = np.linspace(ymin, ymax, ny)
# Requires installation of natgrid
# http://sourceforge.net/projects/matplotlib/files/matplotlib-toolkits/
zi = ml.griddata(x, y, z, xi, yi, interp='nn')
# Or, without natgrid:
# zi = ml.griddata(x, y, z, xi, yi, interp='linear')
plt.contour(xi, yi, zi, 15, linewidths = 0.5, colors = 'k')
plt.pcolormesh(xi, yi, zi, cmap = plt.get_cmap('rainbow'))
plt.colorbar()
plt.scatter(x, y, marker = 'o', c = 'b', s = 10, zorder = 10)
plt.xlim(xmin, xmax)
plt.ylim(ymin, ymax)
plt.show()
</code></pre>
<p><img src="https://i.stack.imgur.com/tTqzy.png" alt="enter image description here"/></p>