matplotlib箭袋3d错误

时间:2015-02-14 11:40:32

标签: python matplotlib

我正在运行以下教程中给出的quiver3d示例 http://matplotlib.org/mpl_toolkits/mplot3d/tutorial.html

我正在运行python' Python 2.7.6'在mac Yosemite上使用matplotlib 1.4.2

Python 2.7.6 (default, Sep  9 2014, 15:04:36) 
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.39)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import matplotlib
>>> matplotlib.__version__
'1.4.2'

我正在运行matplotlib教程中给出的示例

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

fig = plt.figure()
ax = fig.gca(projection='3d')
x, y, z = np.meshgrid(np.arange(-0.8, 1, 0.2),
                      np.arange(-0.8, 1, 0.2),
                      np.arange(-0.8, 1, 0.8))

u = np.sin(np.pi * x) * np.cos(np.pi * y) * np.cos(np.pi * z)
v = -np.cos(np.pi * x) * np.sin(np.pi * y) * np.cos(np.pi * z)
w = (np.sqrt(2.0 / 3.0) * np.cos(np.pi * x) * np.cos(np.pi * y) *  np.sin(np.pi * z))

ax.quiver(x, y, z, u, v, w, length=0.1)

plt.show()

但收到以下错误

Traceback (most recent call last):
  File "try.py", line 16, in <module>
    ax.quiver(x, y, z, u, v, w, length=0.1)
  File "/Library/Python/2.7/site-packages/matplotlib/axes/_axes.py", line 4179, in quiver
    q = mquiver.Quiver(self, *args, **kw)
  File "/Library/Python/2.7/site-packages/matplotlib/quiver.py", line 417, in __init__
    X, Y, U, V, C = _parse_args(*args)
  File "/Library/Python/2.7/site-packages/matplotlib/quiver.py", line 379, in _parse_args
    nr, nc = U.shape
ValueError: too many values to unpack

BTW ax是一个Axes3D我使用isinstance(ax, axes3d.Axes3d)验证它并返回True。另外,我验证了Axes3d定义是否包含quiver方法,显然它并没有,而是使用Axes quiver方法。现在我不知道它是否必须有箭袋定义

2 个答案:

答案 0 :(得分:0)

ax需要是一个axes3d对象 - 目前它只是一个普通的axes对象,所以对ax.quiver的调用正在调用2D例程,有不同的功能签名。如果你查看源代码中的那些行,你会看到/Library/Python/2.7/site-packages/matplotlib/quiver.py的第417行试图将你的所有参数x,y,z,u,v,w - 6个args解压缩为5个变量。

我不确定原因,目前无法检查,但出于某种原因,fig.gca(projection="3d") 给你一个axes3d对象,所以2D版本的箭袋正在被caleld而不是3D版本。

如果堆栈上没有轴对象,则进行更多挖掘,fig.gca(...)只调用fig.add_subplot(1,1,1,**kwargs)。这是一个完整的程序吗?或者你是否在同一个程序中做了一些其他的事情之后呢?

您可以尝试将gca调用替换为add_subplot(1,1,1,projection='3d') - 这不会查询堆栈,因此如果您已经有其他内容,则无关紧要。

答案 1 :(得分:0)

我在Linux,python 2.7和早于1.3的matplotlib上遇到了完全相同的问题。 从源代码安装了最新的稳定matplotlib后,它仍然无法正常工作。 只有在清除旧的matplotlib文件后才能使用。