Curso matplotlib - Elementos auxiliares (Flechas)
Podemos utilizar o plt.arrow() para adicionar uma flecha utilizando o matplotlib. Este elemento necessita de pelo menos 4 parâmetros, sendo os dois primeiros (x e y) as coordenadas de x e y onde a flecha inicia, e os outros dois são as distâncias em x (dx) e y (dy) até o final da seta.
Dessa forma, a flecha vai sair da coordenada (x,y) e irá até a coordenada (x + dx, y + dy).
Exemplo:
plt.figure(figsize=(8,6))
plt.scatter(x,y)
plt.arrow(2.5, 1, 0.5, 0.5)
plt.show()
Figura 1 - Gráfico de dispersão com flecha

Observe que a flecha ficou pequena, o que acontece devido ao outros elementos do gráfico e aos valores padrão para as flechas, em geral, serem pequenos. Retirando os pontos e plotando o gráfico:
plt.arrow(2.5,1, 0.5,0.5)
plt.show()
Figura 2 - Gráfico com flecha

Ainda temos uma flecha com a cabeça pequena, mas agora esta evidente que é uma flecha. Podemos alterar diversos parâmetros para melhorar esta flecha.
Largura do corpo da flecha
O parâmetro width controla a largura do corpo da flecha (padrão é 0.001).
Exemplo:
plt.figure(figsize=(8,6))
plt.scatter(x,y)
plt.arrow(2.5,1, 0.5,0.5, width=0.01)
plt.show()
Figura 3 - Gráfico de dispersão com flecha

Exemplo:
plt.figure(figsize=(8,6))
plt.scatter(x,y)
plt.arrow(2.5,1, 0.5,0.5, width=0.1)
plt.show()
Figura 4 - Gráfico de dispersão com flecha

Por padrão, o tamanho da flecha não inclui a ponta da flecha. Por isto que no gráfico acima, o intervalo de inicio e fim da flecha é maior do que o setado pelas coordenadas (x, y) e (x+dx, y+dy).
Para fazer com que o comprimento da flecha inclua a ponta, basta passar o parâmetro length_includes_head como True(padrão é False):
Exemplo:
plt.figure(figsize=(8,6))
plt.scatter(x,y)
plt.arrow(2.5,1, 0.5,0.5, width=0.1, length_includes_head=True)
plt.show()
Figura 5 - Gráfico de dispersão com flecha

Largura da ponta da flecha
Podemos controlar a largura da ponta da flecha através do parâmetro head_width. Idealmente, este parâmetro deve ser proporcional a outras partes da flecha. Como padrão, temos que head_width = 3*width.
Exemplo:
plt.figure(figsize=(8,6))
plt.scatter(x,y)
plt.arrow(2.5,1, 0.5,0.5, width=0.1, length_includes_head=True, head_width=3*0.1)
plt.show()
Figura 6 - Gráfico de dispersão com flecha

Exemplo:
plt.figure(figsize=(8,6))
plt.scatter(x,y)
plt.arrow(2.5,1, 0.5,0.5, width=0.1, length_includes_head=True, head_width=2*0.1)
plt.show()
Figura 7 - Gráfico de dispersão com flecha

Exemplo:
plt.figure(figsize=(8,6))
plt.scatter(x,y)
plt.arrow(2.5,1, 0.5,0.5, width=0.1, length_includes_head=True, head_width=1*0.1)
plt.show()
Figura 8 - Gráfico de dispersão com flecha

Comprimento da ponta da flecha
Também podemos controlar o comprimento da ponta da flecha, o que é feito através do parâmetro head_length. Idealmente, este parâmetro deve ser proporcional a alguma parte da flecha, geralmente a largura da flecha (o padrão é 1.5*head_width).
Exemplo:
plt.figure(figsize=(8,6))
plt.scatter(x,y)
plt.arrow(2.5,1, 0.5,0.5, width=0.1, length_includes_head=True, head_length=0.5)
plt.show()
Figura 9 - Gráfico de dispersão com flecha

Exemplo:
plt.figure(figsize=(8,6))
plt.scatter(x,y)
plt.arrow(2.5,1, 0.5,0.5, width=0.1, length_includes_head=True, head_length=0.1)
plt.show()
Figura 10 - Gráfico de dispersão com flecha

Forma da cabeça da flecha
Podemos controlar a forma da ponta da flecha através do parâmetro shape. Temos 3 opções, sendo que o padrão 'full' desenha uma ponta completa, 'right' desenha apenas a parte à esquerda da ponta da flecha, e 'left' desenha apenas a parte à direita da ponta da flecha.
plt.figure(figsize=(8,6))
plt.scatter(x,y)
plt.arrow(2.5,1, 0.5,0.5, width=0.1, length_includes_head=True, head_length=0.1, shape='right')
plt.show()
Figura 11 - Gráfico de dispersão com flecha

Exemplo:
plt.figure(figsize=(8,6))
plt.scatter(x,y)
plt.arrow(2.5,1, 0.5,0.5, width=0.1, length_includes_head=True, head_length=0.1, shape='left')
plt.show()
Figura 12 - Gráfico de dispersão com flecha

Maiores informações na documentação.