Matplotlib调用Axes3DSubplot.voxels报错:对象无该属性
解决Axes3DSubplot无voxels方法的问题
这个问题原因很明确——你的matplotlib版本太老啦!voxels方法是在matplotlib 2.1.0版本才正式添加到3D坐标轴中的,而你当前使用的是2.0.2版本,自然会抛出AttributeError。
解决方案一:升级matplotlib(推荐)
因为你用的是Anaconda环境,直接在终端运行以下命令升级:
conda install matplotlib>=2.1.0
如果是用pip管理包,就运行:
pip install --upgrade matplotlib
升级完成后,你的原有代码就能正常运行,不需要做任何修改。
解决方案二:不升级版本的替代方案(适合特殊场景)
如果因为某些原因无法升级matplotlib,可以手动实现简单的体素绘制逻辑。比如遍历每个需要显示的体素,绘制它的六个面:
import noise import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D def draw_voxel(ax, x, y, z, color='green', edgecolor='k'): # 定义体素的六个面的坐标 faces = [ # 前面 [[x, x+1], [y, y+1], [z, z]], # 后面 [[x, x+1], [y, y+1], [z+1, z+1]], # 左面 [[x, x], [y, y+1], [z, z+1]], # 右面 [[x+1, x+1], [y, y+1], [z, z+1]], # 下面 [[x, x+1], [y, y], [z, z+1]], # 上面 [[x, x+1], [y+1, y+1], [z, z+1]], ] for face in faces: X, Y, Z = np.array(face) ax.plot_surface(X, Y, Z, color=color, edgecolor=edgecolor) x, y, z = np.indices((8,8,8)) voxels = np.zeros((8,8,8), dtype=np.bool) for xp in range(8): for yp in range(8): for zp in range(8): voxels[xp,yp,zp] = abs(noise.pnoise3(xp/8,yp/8,zp/8)) > 0.5 fig = plt.figure() ax = fig.gca(projection='3d') # 遍历所有体素,绘制需要显示的 for xp in range(8): for yp in range(8): for zp in range(8): if voxels[xp,yp,zp]: draw_voxel(ax, xp, yp, zp) ax.set_xlim(0,8) ax.set_ylim(0,8) ax.set_zlim(0,8) plt.show()
不过这种方法的效率和效果肯定不如官方的voxels方法,所以还是优先推荐升级版本。
内容的提问来源于stack exchange,提问作者sawyermclane
相关产品推荐
相关产品推荐

