Matplotlib:“未知投影'3d'”错误


130

我刚安装了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'


它非常适合我。Windows XP,活动状态python 2.6.5 matplotlib 1.0.0。
joaquin 2010年

您正在使用哪个版本的python?
查理·帕克

Answers:


114

首先,我认为版本的mplot3D工作方式与当前版本的有所不同。matplotlib0.99matplotlib

您正在使用哪个版本?(尝试运行:python -c 'import matplotlib; print matplotlib."__version__")

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

如果您正在运行version 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


47
@dashesy-您仍然需要导入3d投影:from mpl_toolkits.mplot3d import Axes3D。之后,它应该工作。
Joe Kington

2
啊哈,有趣!在示例中看到了它,但猜测它仅适用于旧版本。谢谢
dashesy 2013年

2
python 3的打印版本的命令是python -c 'import matplotlib; print(matplotlib.__version__)'
Charlie Parker

2
那版本2.0.2呢?
查理·帕克

1
我在python 2.7,matplotlib .__ from mpl_toolkits.mplot3d import Axes3D
version__

64

只是为了增加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')

实际上,只要存在Axes3D导入,

from mpl_toolkits.mplot3d import Axes3D
...
ax = fig.gca(projection='3d')

OP所使用的也可以。(已使用matplotlib 1.3.1版检查)


4
知道这真的很有帮助!虽然从未明确使用过Axes3D导入,但是它可以无误地使用projection ='3d'–
火炉

3
导入声明使它对我有用。但是我无法通过运行这段代码感到讨厌...使用import语句引导一些看起来完全分离在表面上的代码似乎是一个糟糕的设计
Ezbob

2
ax = fig.gca(projection='3d')确实为我工作。代替ax = plt.subplot(111,projection="3d")。我使用的版本是2.1.0
Johnny Zhang

2
@Ezbob整个matplotlib API简直就是一头雾水。如果我想创建一个基本情节,我总是要用谷歌搜索。没有其他python库具有如此糟糕的API
Simon H


4

我遇到了同样的问题,@ Joe Kington和@bvanlew的答案解决了我的问题。

但是当您使用pycharm并启用时,我应该添加更多信息auto import

格式化代码时,代码from mpl_toolkits.mplot3d import Axes3D会被pycharm自动删除。

所以,我的解决方案是

from mpl_toolkits.mplot3d import Axes3D
Axes3D = Axes3D  # pycharm auto import
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

而且效果很好!


您也可以# noinspection PyUnresolvedReferences在导入之前放。
Michael Bikovitsky

0

试试这个:

import matplotlib.pyplot as plt
import seaborn as sns
from mpl_toolkits.mplot3d import axes3d

fig=plt.figure(figsize=(16,12.5))
ax=fig.add_subplot(2,2,1,projection="3d")

a=ax.scatter(Dataframe['bedrooms'],Dataframe['bathrooms'],Dataframe['floors'])
plt.plot(a)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.