2014-12-05 3 views
0

Я использую matplotlib для создания аннотаций со стрелками.Стрелки аннотации Python с одинаковой головной частью

from matplotlib import pyplot as plt 
plt.figure() 
plt.annotate('Text1', xy=(1, 0), xytext=(1, 1), arrowprops=dict(alpha=0.5, fc='r', ec='r', headwidth=10)) 
plt.annotate('Text2', xy=(3, 0), xytext=(3, 3), arrowprops=dict(alpha=0.5, fc='r', ec='r', headwidth=10)) 
plt.annotate('Text3', xy=(6, 0), xytext=(6, 6), arrowprops=dict(alpha=0.5, fc='r', ec='r', headwidth=10)) 
plt.annotate('Text4', xy=(9, 0), xytext=(9, 9), arrowprops=dict(alpha=0.5, fc='r', ec='r', headwidth=10)) 
plt.xlim((0, 10)) 
plt.ylim(0, 10) 
plt.show() 

enter image description here

Как можно видеть, длина стрел на зависит от линии длины и изменяется между стрелками.

Я ищу способ создания стрелок с разной длиной строки, но равных стрелкам. Хотя на странице руководства аннотаций указано множество опций, я не смог получить желаемый результат.

В качестве альтернативного подхода я попытался построить стрелки отдельно, используя plt.arrow. В этом случае стрелки выглядели по желанию, но при использовании прозрачности стали видны дополнительные линии.

С наилучшими пожеланиями, zinjaai

ответ

1

В arrowprops вы не можете определить длину головы, но frac arguement определяет длину головки в виде дроби длины стрелка. Так как вы знаете xy и xytext, вы можете вычислить необходимую фракцию для желаемой длины.

Я делаю это не быстро для примера, который вы предоставили (с длиной головы 0.5).

from matplotlib import pyplot as plt 
plt.figure() 
plt.annotate('Text1', xy=(1, 0), xytext=(1, 1), 
     arrowprops=dict(alpha=0.5, fc='r', ec='r', headwidth=10, frac=0.5/1)) 
plt.annotate('Text2', xy=(3, 0), xytext=(3, 3), 
     arrowprops=dict(alpha=0.5, fc='r', ec='r', headwidth=10, frac=0.5/3)) 
plt.annotate('Text3', xy=(6, 0), xytext=(6, 6), 
     arrowprops=dict(alpha=0.5, fc='r', ec='r', headwidth=10, frac=0.5/6)) 
plt.annotate('Text4', xy=(9, 0), xytext=(9, 9), 
     arrowprops=dict(alpha=0.5, fc='r', ec='r', headwidth=10, frac=0.5/9)) 
plt.xlim((0, 10)) 
plt.ylim(0, 10) 
plt.show() 

Результат:

enter image description here

Вы можете обернуть это в функцию, которая вычисляет длину стрелы (при xy и xytext), а затем передает его на plt.annotate.