You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:54:12