2013-03-15 2 views
2

Я получаю странное исключение, вызванное обратным вызовом Tkinter окна Matplotlib. Контекст: я запускаю Python 3.2 в окне IPython QTconsole в режиме pylab. Проблема, которую я кодирую, включает трехмерное построение над треугольными областями.Ошибка Matplotlib/Tkinter: исключение при сравнении объектов collection3d

(прошу прощения, если фрагмент кода достаточно долго, я нашел ошибку трудно воспроизвести.)

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-raise, я не могу его поймать в PDB и проанализировать. (В частности, существует много неназванных аргументов, переданных промежуточным методам в трассировке стека, из-за которых невозможно выполнить его вручную). Мне удалось выяснить, что, действительно, экземпляр Axes3D пытается сортировать его список объектов Line3DCollection и работает против не реализованного метода сравнения.

Мой вопрос: является ли это ошибкой, о которой следует знать Matplotlib, или я делаю какую-то ошибку основного пользователя? (Как уже упоминалось, ошибка неуловима, она не всегда появляется, особенно если я параметризую треугольники по-разному.)

+0

Какую версию mpl вы используете? Я не получаю это при установке рядом с текущим мастером (но мне, возможно, повезло). Я думаю, что это стоит создать вопрос MPL, если обновление не заставит его уйти. Исключение происходит с пути вниз в backend, и в 3D-коде было много работы в последнее время. – tacaswell

+0

Mpl версия 1.2.0 – MSmedberg

+0

Я бы создал проблему для этого. Существует кандидат на выпуск версии 1.2.x, который вы можете попробовать. – tacaswell

ответ

0

Проблема исправлена ​​путем обновления mpl 1.2.1 (как сообщается в комментариях к OP).

Смежные вопросы