5.10. Arrow - стрелка

Если необходимо сфокусировать внимание на определенном участке графика - то это проще всего сделать с помощью стрелок:

import numpy as np
import matplotlib.pyplot as plt


x = np.linspace(-5, 5, 100)
y = x*(x - 4)*(x + 4)



fig, ax = plt.subplots()

ax.plot(x, y)
ax.arrow(-2.3, 0, 0, 20,
         width = 0.1,
         head_length = 4)
ax.arrow(2.3, 0, 0, -20,
         width = 0.1,
         head_length = 4)

fig.set_figwidth(12)    #  ширина и
fig.set_figheight(6)    #  высота "Figure"

plt.show()

Matplotlib arrow


Параметры отображения

В самом простом случае стрелка задается всего четырьмя параметрами:

  • x, y - координаты начала стрелки;
  • dx, dy - длина стрелки по оси x и y.

Но при этом сама стрелка не совсем похожа на стрелку:

import matplotlib.pyplot as plt

fig, ax = plt.subplots()

ax.arrow(0.1, 0.3, 0.7, 0.3)

plt.show()

Matplotlib arrow без параметров

Более того, даже если нас устраивает такой вид стрелки, она будет рисоваться только в области Axes ограниченной нулем и единицей:

import matplotlib.pyplot as plt

fig, ax = plt.subplots()

ax.arrow(0.1, 0.3, 1.3, 1.7)

plt.show()

Matplotlib arrow без параметров ограничена областью от 0 до 1

Такое поведение стрелки меняется если диапазон значений x и y задан другим методом Axes или если он изменен вручную. Ну а придать стрелке "нормальный" вид можно, указав в параметре width какое-нибудь значение (желательно, небольшое так как по умолчанию width = 0.001):

import matplotlib.pyplot as plt

fig, ax = plt.subplots()

ax.arrow(0.1, 0.3, 1.3, 1.7,
         width = 0.05)    #  ширина стрелки

#  Установим диапазон значений:
ax.set_xticks([0, 1, 2, 3])
ax.set_yticks([0, 1, 2, 3])

plt.show()

Matplotlib arrow нормальное отображение при задании ширины диапазона значений


Параметры отображения

Рано или поздно вы заметите, что длина стрелки не включает в себя длину острия. Изменить такое поведение можно с помощью параметра length_includes_head установленным в True:

import matplotlib.pyplot as plt

fig, ax = plt.subplots()

ax.arrow(0, 1, 2, 0,
         width = 0.05)

#  Длина стрелки будет включать в себя
#  длину острия:
ax.arrow(0, 2, 2, 0,
         length_includes_head = True,
         width = 0.05)

#  Установим диапазон значений:
ax.set_xticks([0, 1, 2, 3])
ax.set_yticks([0, 1, 2, 3])

plt.show()

Matplotlib arrow включение в динну стрелки длинны острия

Ширина острия стрелки по умолчанию равно трем значениям ширины ее основной линии. С помощью параметра head_width можно установить произвольное значение ширины острия:

import matplotlib.pyplot as plt

fig, ax = plt.subplots()

ax.arrow(0, 1, 1.3, 0,
         width = 0.05)

#  head_width - ширина острия стрелки:
ax.arrow(0, 1.5, 1.5, 0,
         head_width = 0.3,
         width = 0.05)
ax.arrow(0, 2, 2, 0,
         head_width = 0.6,
         width = 0.05)

#  Установим диапазон значений:
ax.set_xticks([0, 1, 2, 3])
ax.set_yticks([0, 1, 2, 3])

plt.show()

Matplotlib arrow ширина острия стрелки

Параметр head_length позволяет задать длину острия стрелки (по умолчанию длина острия равна 3/2 от ширины острия):

import matplotlib.pyplot as plt

fig, ax = plt.subplots()

#  head_length - длина острия стрелки:
ax.arrow(0, 1, 1.3, 0,
         head_length = 0.1,
         width = 0.05)
ax.arrow(0, 1.5, 1.5, 0,
         head_length = 0.5,
         width = 0.05)
ax.arrow(0, 2, 2, 0,
         head_length = 1,
         width = 0.05)

#  Установим диапазон значений:
ax.set_xticks([0, 1, 2, 3])
ax.set_yticks([0, 1, 2, 3])

plt.show()

Matplotlib arrow: длинна острия стрелки

С помощью параметра shape мы можем выбирать: рисовать ли стрелку полностью или только какую-то ее половину:

import matplotlib.pyplot as plt

fig, ax = plt.subplots()

#  shape - форма стрелки:
ax.arrow(0, 0.5, 2, 0,
         shape = 'full',    #  по умолчанию
         width = 0.1)
ax.arrow(0, 1, 2, 0,
         shape = 'left',
         width = 0.1)
ax.arrow(0, 1.5, 2, 0,
         shape = 'right',
         width = 0.1)

#  color - задает цвет стрелки:
ax.arrow(0, 2.5, 2, 0,
         shape = 'left',
         color = 'r',
         width = 0.1)
ax.arrow(0, 2.5, 2, 0,
         shape = 'right',
         color = 'g',
         width = 0.1)

#  Установим диапазон значений:
ax.set_xticks([0, 1, 2, 3])
ax.set_yticks([0, 1, 2, 3])

plt.show()

Matplotlib arrow отрисовка половины стрелки

Выровнять основание острия можно с помощью параметра overhang:

import matplotlib.pyplot as plt

fig, ax = plt.subplots()

ax.arrow(0.1, 0.5, 2, 0,
         width = 0.1)

#  overhang - выравнивание края
#  стрелки:
ax.arrow(0.1, 1, 2, 0,
         overhang = 0.2,
         width = 0.1)
ax.arrow(0.1, 1.5, 2, 0,
         overhang = 0,
         width = 0.1)
ax.arrow(0.1, 2, 2, 0,
         overhang = -0.2,
         width = 0.1)

#  Установим диапазон значений:
ax.set_xticks([0, 1, 2, 3])
ax.set_yticks([0, 1, 2, 2.5])

plt.show()

Matplotlib arrow: выравнивание основания острия


Цвет стрелки и ее края

В одном из примеров мы уже устанавливали цвет стрелки с помощью параметра color, но он переопределяет цвет края стрелки. Поэтому, в этом случае мы должны указать цвет стрелки с помощью параметра facecolor:

import matplotlib.pyplot as plt

fig, ax = plt.subplots()

ax.arrow(0.2, 1.5, 2.5, 0,
         facecolor = 'red',    #  цвет стрелки
         edgecolor = 'black',  #  цвет края
         linewidth = 3,        #  ширина линии края
         linestyle = '--',     #  начертание линии
         width = 0.6,
         head_length = 0.9,
         length_includes_head = True)



#  Установим диапазон значений:
ax.set_xticks([0, 1, 2, 3])
ax.set_yticks([0, 1, 2, 3])

plt.show()

Matplotlib arrow: цвет стрелки и ее краевой линии