我有一个二维 Numpy NDarray 填充了 0 到大约 8 之间的 float 。这个二维数组大小是 (1000, 1600)
并且有大约 1400 个值,(点中的点云),其余值为 None
,因此 matplotlib 不会绘制这些值。您可以在下图中看到绘制的表格。我想要的是,无值与其旁边的值进行插值以获得类似梯度的热图。这个点云表示屋顶的形状,我想将此数据处理成图像,我可以将其输入神经网络以检测屋顶的类型。
我用于这个情节的代码很短,
import matplotlib.pyplot as plt
plt.clf()
#plotGrid is the numpy.ndarray with shape (1000, 1600) and dtype float
plt.imshow(plotGrid, cmap='gray', interpolation='nearest')
plt.colorbar()
plt.show()
最佳答案
tricontourf
您可以使用有效值的 tricontour
/tricontourf
图。为此,您首先需要过滤掉所有 nan
值(您确实应该将无效值设置为 np.nan
而不是 None
)。
这些值连同它们的坐标可以放入 plt.tricontourf()
以获得等高线图,而无需手动插值。
import matplotlib.pyplot as plt
import numpy as np
# Generate some example data
f = lambda x,y : np.exp((-(x-150)**2-(y-150)**2)/3.e3)
plotGrid = np.zeros((300,300))*np.nan
coo = np.random.randint(5,295, size=(150,2) )
for x,y in coo:
plotGrid[y,x] = f(x,y)
#plotGrid is now a numpy.ndarray with shape (300,300), mostly np.nan, and dtype float
# filter out nan values and get coordinates.
x,y = np.indices(plotGrid.shape)
x,y,z = x[~np.isnan(plotGrid)], y[~np.isnan(plotGrid)], plotGrid[~np.isnan(plotGrid)]
plt.tricontourf(x,y,z)
plt.colorbar()
plt.show()
三色
然后使用 tripcolor
是另一种选择:
plt.tripcolor(x,y,z, shading='gouraud')
插值和contourf
您也可以先使用 matplotlib.mlab.griddata
在网格上插入数据,然后使用普通的 contourf
图,
xi = np.linspace(0, plotGrid.shape[1], plotGrid.shape[1])
yi = np.linspace(0, plotGrid.shape[0], plotGrid.shape[0])
zi = mlab.griddata(x, y, z, xi, yi, interp='linear')
plt.contourf(xi, yi, zi, 15)
插值和imshow
或者以同样的方式使用imshow
plot,
plt.imshow(zi)
关于python - 如何将 2D 网格化点云插值到连续区域?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43806077/