Как я могу накладывать аннотации друг на друга с помощью matplotlib?

#python #matplotlib

#питон #matplotlib

Вопрос:

Я хотел бы сгенерировать фигуру с векторным разложением по двум осям (см. Пример ниже), и для этого я использую matplotlib.axes.Axes.annotate() (docs). Похоже, что matplotlib автоматически перемещает кончики маленьких красных стрелок, чтобы они не попадали на большие черные. Я пытался просмотреть документы, но не могу найти решение. Я также приму другие библиотеки в качестве ответа.

 from matplotlib import pyplot as plt

fig, ax = plt.subplots(1,1)

# Square aspect ratio
ax.set_aspect(1)
ax.set(xlim=[-1,1], ylim=[-1,1], xticks=[], yticks=[])

# Draw image
ax.annotate('f', (-1, 0), (1, 0), arrowprops=dict(arrowstyle='<-'))
ax.annotate('s', (0, -1), (0, 1), arrowprops=dict(arrowstyle='<-'))
ax.annotate('', (0, 0), (.5, .5), arrowprops=dict(arrowstyle='<-', color='r'))    
ax.annotate('', (0, 0), (0, .5), arrowprops=dict(color='r',arrowstyle='<-', ls='--'))
ax.annotate('', (0, 0), (.5, 0), arrowprops=dict(color='r',arrowstyle='<-', ls='--'))
 

Этот код генерирует это изображение

Комментарии:

1. попробуйте установить для параметров сжатия значение 0: arrowprops=dict(arrowstyle='<-', shrinkA=0, shrinkB=0)

2. Спасибо за идею, @tmdavison, но это ничего не дало. Я принимаю ответ Дизиета Асахи!

Ответ №1:

Похоже, это как-то связано с выравниванием стрелки и текста аннотации. Однако я не уверен, является ли это ошибкой или она была сделана специально.

Сравнить:

 fig, (ax1,ax2) = plt.subplots(1,2, figsize=(8,4))
for ax in [ax1,ax2]:
    ax.set(xlim=[-1,1], ylim=[-0.1,0.1], xticks=[], yticks=[])
ax1.annotate('A', (-1, 0), (1, 0), arrowprops=dict(arrowstyle='<-', color='k'))
ax1.annotate('', (-1, 0), (1, 0), arrowprops=dict(color='r',arrowstyle='<-', ls='--'))

ax2.annotate('', (-1, 0), (1, 0), arrowprops=dict(arrowstyle='<-', color='k'))
ax2.annotate('', (-1, 0), (1, 0), arrowprops=dict(color='r',arrowstyle='<-', ls='--'))
 

введите описание изображения здесь

Таким образом, моим решением для вас было бы удалить текст из имеющихся у вас аннотаций со стрелками и добавить его с отдельной аннотацией или ax.text()