17

编辑:本文末尾的解决方法。

我试图运行此处此处提供的一些示例。

其中一个例子是:

from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

u = np.linspace(0, 2 * np.pi, 100)
v = np.linspace(0, np.pi, 100)

x = 10 * np.outer(np.cos(u), np.sin(v))
y = 10 * np.outer(np.sin(u), np.sin(v))
z = 10 * np.outer(np.ones(np.size(u)), np.cos(v))
ax.plot_surface(x, y, z,  rstride=4, cstride=4, color='b')

plt.show()

这给了我以下错误:

/usr/lib/pymodules/python2.7/mpl_toolkits/mplot3d/axes3d.py:842: MatplotlibDeprecationWarning: The set_scale function was deprecated in version 1.3.
  self.zaxis.set_scale('linear')
Traceback (most recent call last):
  File "/mnt/hgfs/MCLS/postprocessing/surface3d_demo2.py", line 6, in <module>
    ax = fig.add_subplot(111, projection='3d')
  File "/usr/local/lib/python2.7/dist-packages/matplotlib-1.4.x-py2.7-linux-x86_64.egg/matplotlib/figure.py", line 958, in add_subplot
    a = subplot_class_factory(projection_class)(self, *args, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/matplotlib-1.4.x-py2.7-linux-x86_64.egg/matplotlib/axes/_subplots.py", line 78, in __init__
    self._axes_class.__init__(self, fig, self.figbox, **kwargs)
  File "/usr/lib/pymodules/python2.7/mpl_toolkits/mplot3d/axes3d.py", line 78, in __init__
    *args, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/matplotlib-1.4.x-py2.7-linux-x86_64.egg/matplotlib/axes/_base.py", line 436, in __init__
    self.cla()
  File "/usr/lib/pymodules/python2.7/mpl_toolkits/mplot3d/axes3d.py", line 847, in cla
    Axes.cla(self)
  File "/usr/local/lib/python2.7/dist-packages/matplotlib-1.4.x-py2.7-linux-x86_64.egg/matplotlib/axes/_base.py", line 897, in cla
    self.grid(self._gridOn, which=rcParams['axes.grid.which'])
  File "/usr/lib/pymodules/python2.7/mpl_toolkits/mplot3d/axes3d.py", line 1057, in grid
    self._draw_grid = maxes._string_to_bool(b)
AttributeError: 'module' object has no attribute '_string_to_bool'

错误源于: ax = fig.add_subplot(111, projection='3d')

我试图检查和升级 matplotlib。跑步python -c 'import matplotlib; print matplotlib.__version__'给了我1.4.x

我深入研究了底层代码,发现了这个:

def grid(self, b=True, **kwargs):
'''
Set / unset 3D grid.

.. note::
    Currently, this function does not behave the same as
    :meth:`matplotlib.axes.Axes.grid`, but it is intended to
    eventually support that behavior.

.. versionchanged :: 1.1.0
    This function was changed, but not tested. Please report any bugs.
'''
# TODO: Operate on each axes separately
if len(kwargs) :
    b = True
self._draw_grid = maxes._string_to_bool(b)

谁能给我一个建议在哪里走得更远?

编辑:我找到了解决此问题的方法。从上一条错误消息中可以看出,_string_to_bool函数中出现了问题。只需添加以下行

from matplotlib.cbook import _string_to_bool

在之上

/usr/lib/pymodules/python2.7/mpl_toolkits/mplot3d/axes3d.py 

我仍然收到一条错误消息,但至少我得到了一些输出。

4

6 回答 6

11

对我来说,(Ubuntu 14.04,使用系统 Python)通过删除 apt 包python-matplotlib(由这个错误报告提示)解决了这个问题。更新的 matplotlib 也通过 pip 安装在 /usr 中;我认为一些较新的 pip 包以某种方式从较旧的 apt 包中获取模块。

这是在尝试了 meyerson 的pip install --upgrade --ignore-installed matplotlib[mplot3d]命令之后,这确实导致 NumPy 被重新编译(并且,我想,Matplotlib 被重新安装),但并没有解决问题。

还值得注意的是,我只在命令行运行有问题的脚本(一批单元测试)时遇到问题,但在 LiClipse 测试运行程序(使用不同的、显式可更改的 PYTHONPATH 顺序)中运行时没有问题。我很遗憾我没有尝试更改此顺序以查看是否可以在 Eclipse 中重现该问题。

于 2015-05-14T20:43:59.210 回答
8

我遇到了确切的问题,这是我如何解决的(在我的情况下):

1)重命名(或删除)文件夹mplot3d(所以matplotlib认为它不存在):

/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/mpl_toolkits/mplot3d-old

2)matplotlib使用指定 mplot3d 进行更新:

pip install --upgrade matplotlib[mplot3d]
于 2014-12-10T04:20:22.390 回答
3

对我来说,iamaziz 的答案不起作用,并且问题发生在 Ubuntu 14.04 上,它使用带有 --system-site-packages 和 matplotlib 的 virtualenv,通过 pip 安装了 pandas。我发现移动线路

 from mpl_toolkits.mplot3d import Axes3D

在导入 pandas 解决问题之前。

于 2015-05-14T09:24:07.677 回答
2

添加到@Hennep 的解决方法:

将以下行添加到文件

/usr/lib/pymodules/python2.7/mpl_toolkits/mplot3d/axes3d.py

from matplotlib.cbook import _string_to_bool

然后将代码更改为

def grid(self, b=True, **kwargs):
'''Set / unset 3D grid.

.. note::
Currently, this function does not behave the same as
:meth:`matplotlib.axes.Axes.grid`, but it is intended to
eventually support that behavior.

.. versionchanged :: 1.1.0
This function was changed, but not tested. Please report any bugs.
'''
# TODO: Operate on each axes separately
if len(kwargs) :
    b = True
self._draw_grid = _string_to_bool(b)

从函数中删除这个词maxes,如果我这样做,一切对我来说都很好。

于 2014-11-12T05:58:15.680 回答
1

使用与此处发布的解决方法非常相似的解决方法,我能够在 OS X 10.10.2 中运行。这里发布的具体解决方法都不适用于我的情况,但它们让我走上了解决问题的正确轨道。所有 mplot3d 的东西都在我的 linux 机器上工作,而不是在我的 mac 上。我在 OS X 端使用自制软件。我在 cbook 中遇到错误,特别是 _string_to_bool 错误。在 cbook.py、axes3d.py 和 axes.py 中进行了调用。我为解决方法所做的只是在我的 linux 机器上跟踪 axes3d.py、axes.py 和 cbook.py 文件,并在我的 OS X 机器上替换这些文件,之后一切正常,我能够使用 mplot3。Homebrew 使用了很多符号链接,所以请注意,我喜欢备份原始文件并在那里替换它们,而不是在链接级别。Brew 也可能会分散文件,

/Library/Python/2.7/site-packages/matplotlib-override/matplotlib/axes.py

/usr/local/Cellar/matplotlib/1.4.2/lib/python2.7/site-packages/mpl_toolkits/mplot3d/axes3d.py

/usr/local/Cellar/matplotlib/1.4.2/lib/python2.7/site-packages/matplotlib/cbook.py

在 linux 端(从 /usr/lib/pymodules/python2.7 符号链接):/usr/share/pyshared/matplotlib/axes.py

/usr/share/pyshared/matplotlib/cbook.py

/usr/share/pyshared/mpl_toolkits/mplot3d/axes3d.py

只需备份,用你的 linux 机器中的文件替换,然后试一试,对我有用。

如果您没有在 linux 上运行的版本,您可能只能从 github 中提取 axes.py、axes3d.py 和 cbook.py,其中发布了 matplotlibs .py 文件。

于 2015-03-13T16:25:28.320 回答
1

就我而言,我正在导入seabornpandas 以及Axes3D在Axes3D消除错误后导入 seabornpandas 。

于 2016-07-26T21:52:41.867 回答