Matplotlib:"未知投影'3d'"错误

rec*_*gle 114 python matplotlib

我刚刚安装了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()
Run Code Online (Sandbox Code Playgroud)

错误是

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'
Run Code Online (Sandbox Code Playgroud)

Joe*_*ton 108

首先,我认为mplot3D在matplotlib版本0.99中的工作方式与在当前版本的matplotlib中的工作方式略有不同.

你使用的是哪个版本?(尝试运行:mplot3D)

我猜你正在运行0.99版本,在这种情况下你需要使用稍微不同的语法或更新到更新版本的matplotlib.

如果您运行的是0.99版本,请尝试执行此操作,而不是使用matplotlib关键字参数:

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()
Run Code Online (Sandbox Code Playgroud)

这应该在matplotlib 1.0.x中工作,而不仅仅是0.99.

  • @dashesy - 你仍然需要导入3d投影:`from mpl_toolkits.mplot3d import Axes3D`.之后,它应该工作. (40认同)
  • 我对 python 2.7, matplotlib.__version__ '2.2.3' 出现此错误...因为我没有使用 `from mpl_toolkits.mplot3d import Axes3D`...:) (3认同)
  • 我只是试过了,projection ='3d'不适用于1.2.1 (2认同)
  • 啊哈,有趣!在示例中看到了它,但猜测它仅适用于旧版本。谢谢 (2认同)
  • 用于python 3的打印版本的命令是`python -c'import matplotlib; print(matplotlib .__ version __)'` (2认同)
  • 怎么样的版本`2.0.2`? (2认同)

bva*_*lew 56

只是为了添加Joe Kington的答案(评论的声誉不够),在http://matplotlib.org/examples/mplot3d/mixed_subplots_demo.html的文档中有一个混合2d和3d图的好例子,其中显示了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')
Run Code Online (Sandbox Code Playgroud)

实际上只要Axes3D导入就行了

from mpl_toolkits.mplot3d import Axes3D
...
ax = fig.gca(projection='3d')
Run Code Online (Sandbox Code Playgroud)

OP使用也有效.(使用matplotlib 1.3.1版检查)

  • 这实际上真的很有用!虽然从未明确使用Axes3D导入,但可以使用projection ='3d'而不会出错 (3认同)
  • 导入声明使它对我有用.但是通过运行这段代码我不禁感到icky ...使用import语句来引导一些在表面看起来完全分离的代码看起来像一个糟糕的设计 (3认同)
  • `ax = fig.gca(projection ='3d')`对我有用.而不是`ax = plt.subplot(111,projection ="3d")`.我正在使用`2.1.0`的版本 (2认同)
  • @Ezbob 整个 matplotlib API 只是个麻烦事。如果我想创建一个基本的情节,我总是必须谷歌。没有其他 python 库有这么糟糕的 API (2认同)

Tus*_*rma 15

导入 mplot3d 整体以使用“projection = '3d'”。

在脚本顶部插入以下命令。它应该运行良好。

从 mpl_toolkits 导入 mplot3d