值错误:未知投影'3d
我刚安装了matplotlib,想运行他们的一个示例脚本。但是我遇到了下面详细描述的错误。我哪里做错了呢?
from mpl_toolkits.mplot3d import axes3d
import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.gca(projection='3d')
X, Y, Z = axes3d.get_test_data(0.05)
cset = ax.contour(X, Y, Z, 16, extend3d=True)
ax.clabel(cset, fontsize=9, inline=1)
plt.show()
错误信息是
Traceback (most recent call last):
File "<string>", line 245, in run_nodebug
File "<module1>", line 5, in <module>
File "C:\Python26\lib\site-packages\matplotlib\figure.py", line 945, in gca
return self.add_subplot(111, **kwargs)
File "C:\Python26\lib\site-packages\matplotlib\figure.py", line 677, in add_subplot
projection_class = get_projection_class(projection)
File "C:\Python26\lib\site-packages\matplotlib\projections\__init__.py", line 61, in get_projection_class
raise ValueError("Unknown projection '%s'" % projection)
ValueError: Unknown projection '3d'
7 个回答
14
要使用“projection = '3d'”这个功能,你需要导入整个mplot3d库。
在你的脚本最上面插入下面的命令。这样就可以正常运行了。
from mpl_toolkits import mplot3d
70
我想补充一下Joe Kington的回答(因为我没有足够的声望来评论),在文档中有一个很好的例子,展示了如何将2D和3D图结合在一起。你可以在这个链接找到:http://matplotlib.org/examples/mplot3d/mixed_subplots_demo.html,里面展示了如何使用projection='3d'和Axes3D导入一起工作。
from mpl_toolkits.mplot3d import Axes3D
...
ax = fig.add_subplot(2, 1, 1)
...
ax = fig.add_subplot(2, 1, 2, projection='3d')
实际上,只要有Axes3D的导入,下面这行代码也可以正常工作:
from mpl_toolkits.mplot3d import Axes3D
...
ax = fig.gca(projection='3d')
OP使用的代码也是可以的。(我用matplotlib版本1.3.1检查过)
121
首先,我觉得在 matplotlib
版本 0.99
中,mplot3D
的工作方式和现在的版本有点不同。
你现在用的是哪个版本呢?(可以试着运行:python -c 'import matplotlib; print matplotlib."__version__")
来查看)
我猜你可能在用 0.99
版本,这样的话你需要使用稍微不同的语法,或者更新到更新的 matplotlib
版本。
如果你用的是 0.99
版本,试试这样做,而不是使用 projection
这个关键字参数:
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import axes3d, Axes3D #<-- Note the capitalization!
fig = plt.figure()
ax = Axes3D(fig) #<-- Note the difference from your original code...
X, Y, Z = axes3d.get_test_data(0.05)
cset = ax.contour(X, Y, Z, 16, extend3d=True)
ax.clabel(cset, fontsize=9, inline=1)
plt.show()
这个方法在 matplotlib
1.0.x
版本中也应该能用,不仅仅是 0.99
。