MatplotlibウィンドウのTkinterコールバックによって発生した奇妙な例外が発生します。コンテキスト:Python3.2をQTconsoleIPythonウィンドウで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()
これらのパッチがすべて描画されたら、Figureウィンドウをマウスでクリックすると次のようになります。
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に知らせる必要のあるバグですか、それともある種の基本的なユーザーの間違いを犯していますか?(前述のように、バグは厄介です。特に、三角形をさまざまな方法でパラメーター化した場合、常に表示されるとは限りません。)