子图不会一起显示 + griddata() 返回 "nan" 值
Subplots won't display together + griddata() returning "nan" values
我有一个 9x9 矩阵,其中我知道 8 个值,位于数组 points 中包含的位置,对应的值在数组 values[=29= 中].我想插入未知值并将结果粘贴到 200x200 图像上。
我是 python 的初学者,我正在努力解决以下问题:
我的子图不会一起显示。 Subplot(121) 和 subplot(122) 应该创建一个图像,两个图彼此相邻(水平),但我总是得到两个单独的图像。我做错了什么,为什么?
下面的代码是我尝试使用 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()
我有一个 9x9 矩阵,其中我知道 8 个值,位于数组 points 中包含的位置,对应的值在数组 values[=29= 中].我想插入未知值并将结果粘贴到 200x200 图像上。
我是 python 的初学者,我正在努力解决以下问题:
我的子图不会一起显示。 Subplot(121) 和 subplot(122) 应该创建一个图像,两个图彼此相邻(水平),但我总是得到两个单独的图像。我做错了什么,为什么?
下面的代码是我尝试使用 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()