【问题标题】:Matplotlib/Tkinter bug: exception when comparing collection3d objectsMatplotlib/Tkinter 错误:比较 collection3d 对象时出现异常
【发布时间】:2013-03-04 17:10:52
【问题描述】:

我收到一个由 Matplotlib 窗口的 Tkinter 回调引发的奇怪异常。上下文:我在 QTconsole IPython 窗口中以 pylab 模式运行 Python 3.2。我正在编码的问题涉及三角形区域上的 3D 绘图。

(如果代码 sn-p 较长,我深表歉意;我发现该错误难以重现。)

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?我没有在靠近当前主人的安装中得到这个(但我可能很幸运)。我认为如果更新不能让它消失,这值得创建一个 MPL 问题。异常来自后端,3D 代码最近做了很多工作。
  • 我会为此创建一个问题。您可能想尝试一个 1.2.x 候选版本。
  • 我刚刚又读了一遍,我第一次错过了关于 QTconsole 的内容。这让我对你为什么打电话给 tkinter 感到困惑。您应该在 github 问题中包含 mpl 版本和您使用的后端。
  • 我很困惑;我根本没有手动调用 Tkinter,它只是 MPL 的后端,它在正常的 IPython 会话中运行。如果我手动调用它,我可以捕获异常并自己跟踪它。在任何情况下,异常都会在执行 Tkinter 回调的某个地方引发;但它是由 MPL 方法中的命令引发的,因此它本身不是 TK 问题。
  • 我(显然是错误的)假设使用 qtconsole -> 您正在使用 QT 后端的 matplotlib。

标签: python matplotlib tkinter


【解决方案1】:

通过更新 mpl 1.2.1 解决了这个问题(如 cmets 中向 OP 报告的那样)。

【讨论】:

    猜你喜欢
    • 2011-08-07
    • 1970-01-01
    • 2021-10-06
    • 2010-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-07
    • 2014-10-23
    相关资源
    最近更新 更多