Matplotlib/Tkinter bug:比较collection3d对象时异常

2 投票
1 回答
547 浏览
提问于 2025-04-17 19:16

我在使用Matplotlib窗口的Tkinter回调时遇到了一个奇怪的异常。背景是:我在QTconsole的IPython窗口中运行Python 3.2,使用的是pylab模式。我正在编写的代码涉及在三角形区域上进行3D绘图。

(如果代码片段有点长,我表示歉意;我发现这个错误很难重现。)

from mpl_toolkits.mplot3d import Axes3D
A,B,C,D = array([[0,0],[1,0],[1/2,1],[3/2,1]])
f1 = lambda x,y: NaN if x==y==0 else (y - 2*x)*sin(1/(x**2+y**2))
f2 = lambda x,y: NaN if x==y==0 else (y-2*x+2)*cos(1/(x**2+y**2))
(U,V) = meshgrid(linspace(0,1),linspace(0,1))

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

(X1,Y1) = vectorize(lambda u,v: tuple(A + u*(B-A) + u*v*(C-B)), otypes = [float,float])(U,V)
(X2,Y2) = vectorize(lambda u,v: tuple(D + u*(C-D) + u*v*(B-C)), otypes = [float,float])(U,V)
Z11 = vectorize(f1)(X1,Y1)
Z21 = vectorize(f2)(X1,Y1)
Z12 = vectorize(f1)(X2,Y2)
Z22 = vectorize(f2)(X2,Y2)

ax.plot_wireframe(X1,Y1,Z11)
ax.plot_wireframe(X1,Y1,Z21)
ax.plot_wireframe(X2,Y2,Z12)
ax.plot_wireframe(X2,Y2,Z22)
show()

当所有这些补丁都绘制完成后,在图形窗口中点击鼠标会出现以下情况:

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Python32\lib\tkinter\__init__.py", line 1399, in __call__
    return self.func(*args)
[snip]
  File "C:\Python32\lib\site-packages\mpl_toolkits\mplot3d\axes3d.py", line 191, in draw
    zlist.sort()
TypeError: unorderable types: Line3DCollection() < Line3DCollection()
Exception in Tkinter callback

由于这是一个由Tkinter引发的异常,我无法在PDB中捕获并分析它。(特别是,堆栈跟踪中有很多没有命名的参数传递给中间方法,这让人很难手动跟踪。)我已经发现,确实,Axes3D实例正在尝试对它的Line3DCollection对象列表进行排序,但遇到了一个未实现的比较方法。

我的问题是:这是一个Matplotlib需要注意的错误,还是我犯了一些基本的用户错误?(如前所述,这个错误很难捉摸;它并不总是出现,特别是当我以不同方式参数化三角形时。)

1 个回答

0

这个问题是通过更新mpl到1.2.1版本解决的(在对原作者的评论中提到过)。

撰写回答