matplotlib annotate xycoords = ('данные', 'доля осей') => TypeError: объект 'NoneType' не повторяется - PullRequest
5 голосов
/ 14 мая 2011
>>> import matplotlib
>>> matplotlib.__version__
'0.99.1.1'

работает следующий код:

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()

но закомментированный ax.annotate выдает ошибку:

TypeError: 'NoneType' object is not iterable

это предположительно правильный код в соответствии с текущими документами:

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.

есть идеи о том, что происходит?

EDIT: с момента первой публикации я искал обходной путь и обнаружил еще одну проблему. Когда xycoords = 'data', аннотации все еще обрезаются, если они выходят за пределы осей, даже если clip_on = False. Вот код, который демонстрирует это:

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()

1 Ответ

4 голосов
/ 14 мая 2011

Использование кортежа для обозначения различных преобразований x и y для annotate было добавлено в matplotlib 1.0. Вот соответствующий коммит , если кому-то интересно.Вам нужно будет обновить его до последней версии.

Для второй проблемы это фактически задокументированное поведение.(clip_on - это универсальный текстовый редактор matplotlib kwarg. По-видимому, художники-аннотации ведут себя не одинаково.)

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

Атрибут annotation_clip контролируетвидимость аннотации, когда она выходит за пределы области осей.Если True, аннотация будет отображаться только тогда, когда xy находится внутри осей.Если False, аннотация всегда будет нарисована независимо от ее положения.По умолчанию None, который ведет себя как True, только если xycoords имеет значение «data».

Вместо этого вам нужно будет использовать annotation_clip kwarg:

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()

См. этот поток в списке пользователей matplotlib для дальнейшего обсуждения (а также обратите внимание, что annotation_clip kwarg может быть нарушен на 0.99.1, поэтому вам может потребоваться использовать обходной путь там.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...