子图不会一起显示 + griddata() 返回 "nan" 值

Subplots won't display together + griddata() returning "nan" values

我有一个 9x9 矩阵,其中我知道 8 个值,位于数组 points 中包含的位置,对应的值在数组 values[=29= 中].我想插入未知值并将结果粘贴到 200x200 图像上。

我是 python 的初学者,我正在努力解决以下问题:

  1. 我的子图不会一起显示。 Subplot(121) 和 subplot(122) 应该创建一个图像,两个图彼此相邻(水平),但我总是得到两个单独的图像。我做错了什么,为什么?

  2. 下面的代码是我尝试使用 griddata() 在 200x200 网格上插入已知值。然而,结果 grid_z 完全充满了 nan 值,我不明白为什么或如何解决这个问题.

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

X, Y = np.mgrid[0:1:200j, 0:1:200j]

points = np.array([(3, 8),(5, 8),(4, 6),(4, 4),(2, 4),(6, 4),(3, 0),(5, 0)])
values =  [ 1.82907198,  1.69794981,  1.30089053, -0.00452952,  2.32777365,  0.69508469,  2.06540834,  2.1184028 ]


grid_z = griddata(points, values, (X, Y), method='cubic')

plt.figure

plt.subplot(121)
plt.plot(points[:,0], points[:,1], 'ro', markersize=10)
plt.xlim(0, 8)
plt.ylim(0, 8)
plt.gca().set_aspect('equal', adjustable='box')
plt.title('Original')

plt.subplots(122)
plt.imshow(grid_z.T, extent=(0,8,0,8), origin='lower')
plt.title('Cubic')
plt.gcf().set_size_inches(6, 6)
plt.show()

如有任何帮助,我们将不胜感激!我在网上查阅了几十个类似的帖子,但无法弄清楚我做错了什么。

要使用子图,您需要使用 Matplotlib 的 object-oriented 方法(更多信息 here)。

关于 grid_z 包含 NaN 值,这是因为您选择了错误的离散化域。在下面的代码中,我使用了 X, Y = np.mgrid[2:6:200j, 0:8:200j]:这里 x 将从 2 开始到 6,y 将从 0 到 8。请注意,这个范围涵盖了已知点。在这些已知点之外你会得到 Nan。

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

X, Y = np.mgrid[2:6:200j, 0:8:200j]

points = np.array([(3, 8),(5, 8),(4, 6),(4, 4),(2, 4),(6, 4),(3, 0),(5, 0)])
values =  np.array([ 1.82907198,  1.69794981,  1.30089053, -0.00452952,  2.32777365,  0.69508469,  2.06540834,  2.1184028 ])

grid_z = griddata(points, values, (X, Y), method='linear')

f, axs = plt.subplots(1, 2, tight_layout=True)

cmap = "jet"
norm = Normalize(vmin=values.min(), vmax=values.max())
scatter = axs[0].scatter(points[:,0], points[:,1], c=values, norm=norm, cmap=cmap)
axs[0].set_xlim(0, 8)
axs[0].set_ylim(0, 8)
axs[0].set_aspect('equal', adjustable='box')
axs[0].set_title('Original')

axs[1].imshow(grid_z.T, extent=(0,8,0,8), origin='lower', cmap=cmap)
axs[1].set_title('Cubic')

f.colorbar(scatter)
f.axes[2].set_ylabel("values")
plt.show()