我有一个2维Numpy NDarray填充0到8之间的浮点数.这个2维数组大小是(1000,1600)并且有大约1400个值(点云中的点),其余值是None,所以matplotlib不会绘制这些值.您可以在下图中看到绘制的表格.我想要的是,使用旁边的值插值的None值具有渐变式热图.这个pointcloud代表屋顶的形状,我想把这个数据处理成一个我可以提供给神经网络以检测屋顶类型的图像.
我用于此图的代码很短,
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()
图片(点击放大,看点):
最佳答案
tricontouf
您可以使用有效值的三角图.为此,您首先需要过滤掉所有的nan值(您应该确实使用无效值np.nan而不是None).
可以将这些值及其坐标放入plt.tricontour()中以获得等高线图而无需手动插值.
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,z)
plt.colorbar()
plt.show()
tripcolor
使用tripcolor是另一种选择:
plt.tripcolor(x,z,shading='gouraud')
插值和轮廓
您还可以先使用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,xi,yi,interp='linear')
plt.contourf(xi,zi,15)
插值和imshow
或者以同样的方式使用imshow情节,
plt.imshow(zi)