2011-05-13 6 views
5
>>> import matplotlib 
>>> matplotlib.__version__ 
'0.99.1.1' 

el código siguiente ejecuta:matplotlib anotar xycoords = ('datos', 'ejes fracción') => TypeError: objeto 'NoneType' no es iterable

import matplotlib.pyplot as plt 
plt.figure() 
ax=plt.axes([.1, .1, .8, .8]) 
ax.annotate('++++', xy=(.5,.2), xycoords='data') 
ax.annotate('aaaa', xy=(.5,.4), xycoords='axes fraction') 
#ax.annotate('bbbb', xy=(.5,.6), xycoords=('data', 'axes fraction')) 
plt.show() 

pero el hacha comentado-out. annotate da un error:

TypeError: 'NoneType' object is not iterable 

es código supuestamente correcta de acuerdo con los documentos actuales:

From: http://matplotlib.sourceforge.net/users/annotations_guide.html 

4. A tuple of two coordinate specification. 
    The first item is for x-coordinate and 
    the second is for y-coordinate. 
    For example, 

     annotate("Test", xy=(0.5, 1), xycoords=("data", "axes fraction")) 

    0.5 is in data coordinate, and 1 is in normalized axes coordinate. 

alguna idea sobre lo que está pasando?

EDIT: desde la primera publicación, he estado buscando una solución y descubrí otro problema. Cuando xycoords = 'data', la anotación aún se recorta si cae fuera de los ejes, incluso con clip_on = False. Aquí está el código que demuestra esto:

import matplotlib.pyplot as plt 
plt.figure() 
ax=plt.axes([.1, .1, .8, .8]) 
ax.annotate('cccc', xy=(.3, .5), xycoords='data', clip_on=False) 
ax.annotate('dddd', xy=(.3,-.1), xycoords='data', clip_on=False) 
ax.annotate('eeee', xy=(.6,-.1), xycoords='axes fraction', clip_on=False) 
plt.show() 
+0

¿Qué versión de matplotlib estás usando? Tus dos ejemplos funcionan perfectamente para mí ... –

+0

gracias Joe, matplotlib .__ version__ '0.99.1.1' ... ¿qué versión estás usando? –

+0

@mike - '1.0.1' Creo que la parte" tupla de dos coordenadas especificadas "del kwarg' xcoords' se agregó en matplotlib 1.0. Vea la adición en 2010-02-25 en http://matplotlib.sourceforge.net/_static/CHANGELOG. El último problema es probablemente un error que se corrigió en algún momento. (De hecho, apostaría a que era un error que solo existía en '0.99.1'. No creo que pase desapercibido por mucho tiempo.) –

Respuesta

4

Uso de una tupla para indicar diferentes x y transformadas Y para annotate se añadió en matplotlib 1.0. Here's the relevant commit, si alguien está interesado. Tendrá que actualizar a la última versión para usarlo.

Para el segundo problema, este es en realidad el comportamiento documentado. (clip_on es un genérico matplotlib texto del artista kwarg artistas de anotación no se comportan de la misma manera, al parecer..)

Desde: http://matplotlib.sourceforge.net/api/pyplot_api.html#matplotlib.pyplot.annotate

The annotation_clip attribute contols the visibility of the annotation when it goes outside the axes area. If True, the annotation will only be drawn when the xy is inside the axes. If False, the annotation will always be drawn regardless of its position. The default is None, which behave as True only if xycoords is”data”.

Tendrá que utilizar el kwarg annotation_clip, en su lugar:

import matplotlib.pyplot as plt 
plt.figure() 
ax=plt.axes([.1, .1, .8, .8]) 
ax.annotate('cccc', xy=(.3, .5), xycoords='data', annotation_clip=False) 
ax.annotate('dddd', xy=(.3,-.1), xycoords='data', annotation_clip=False) 
ax.annotate('eeee', xy=(.6,-.1), xycoords='axes fraction', annotation_clip=False) 
plt.show() 

Ver this thread on the matplotlib-users list para más discusión (y también en cuenta que la kwarg annotation_clip puede ser roto en 0.99.1, por lo que puede que tenga que utilizar el workaroun d allí.)

Cuestiones relacionadas