Skip to main content
 首页 » 编程设计

python之Matplotlib/Tkinter 错误 : exception when comparing collection3d objects

2025年05月04日7txw1958

Matplotlib 窗口的 Tkinter 回调引发了一个奇怪的异常。上下文:我在 QTconsole IPython 窗口中以 pylab 模式运行 Python 3.2。我正在编码的问题涉及三角形区域的 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 需要注意的错误,还是我犯了某种基本的用户错误? (如前所述,该错误很挑剔;它并不总是会出现,尤其是当我以不同方式对三角形进行参数化时。)

请您参考如下方法:

问题已通过更新 mpl 1.2.1 解决(如对 OP 的评论中所报告)。