如何在Matplotlib中将4×4矩阵绘制成完整3D imshow风格图?
4×4矩阵的3D可视化解决方案
问题根源
plot_surface 本质是绘制连续曲面,它通过连接相邻数据点生成面网格,因此4×4的点集只会输出3×3的面,这是函数的固有逻辑,并非错误。
方法1:用pcolor3d实现“3D imshow”效果
pcolor3d 是最接近你需求的工具,它会为z数组的每个值绘制一个离散彩色单元格,完全匹配4×4的网格规模。需要生成比z多一行一列的网格边界(每个单元格由4个边界点定义):
import numpy as np import matplotlib.pyplot as plt # 创建4×4的z数组 z = -0.5 * np.arange(4)[:, None] + 0.5 * np.arange(4) # 生成5×5的网格边界,对应4×4的单元格 x_edges = np.arange(0, 5) y_edges = np.arange(0, 5) x_grid, y_grid = np.meshgrid(x_edges, y_edges) fig = plt.figure() ax = fig.add_subplot(111, projection='3d') # 绘制带边框的离散单元格 ax.pcolor3d(x_grid, y_grid, z, cmap='plasma', edgecolor='black', shade=False) # 可选:为每个单元格标注z值 for i in range(4): for j in range(4): ax.text(i+0.5, j+0.5, z[i,j], f'{z[i,j]:.1f}', ha='center', va='center') ax.set_aspect('equal', adjustable='box') plt.show()
方法2:保留曲面风格并显示所有数据点
如果坚持使用plot_surface,可以叠加散点图显示所有4×4的离散数据点,弥补曲面仅显示3×3面的不足:
import numpy as np import matplotlib.pyplot as plt x, y = np.meshgrid(range(0, 4), range(0, 4)) z = -0.5 * x + 0.5 * y fig = plt.figure() ax = fig.add_subplot(111, projection='3d') # 绘制曲面基础 ax.plot_surface(x, y, z, cstride=1, rstride=1, shade=False, cmap='plasma', alpha=0.7) # 叠加显示所有4×4数据点 ax.scatter3D(x.flatten(), y.flatten(), z.flatten(), color='black', s=20) ax.set_aspect('equal', adjustable='box') plt.show()
方法3:用voxels生成3D方块效果
若需要更具立体感的方块可视化,voxels可以生成对应每个z值的立体块:
import numpy as np import matplotlib.pyplot as plt z = -0.5 * np.arange(4)[:, None] + 0.5 * np.arange(4) # 构建体素空间 x, y, z_vox = np.meshgrid(np.arange(4), np.arange(4), np.arange(int(z.max()) + 2)) # 定义需要显示的体素区域 voxels = z_vox <= z[:, :, np.newaxis] fig = plt.figure() ax = fig.add_subplot(111, projection='3d') ax.voxels(voxels, facecolors=plt.cm.plasma(z/z.max()), edgecolor='black') ax.set_aspect('equal', adjustable='box') plt.show()
内容的提问来源于stack exchange,提问作者Robson Barreto
相关产品推荐
相关产品推荐

