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