Есть ли способ нарисовать стрелку внутри круга элегантно - PullRequest
2 голосов
/ 02 июля 2019

Я пытаюсь построить единичный вектор в единичном круге.

вот код

vunit = 1/np.sqrt(2)
vec1 = [vunit,vunit]
thetas = np.arange(-np.pi, np.pi, .05)
coordinates = np.vstack((np.cos(thetas),np.sin(thetas)))

plt.figure(figsize = (6,6))
plt.xlim(-3,3)
plt.ylim(-3,3)
plt.scatter(coordinates[0,:],coordinates[1,:],s=.1)
plt.arrow(0, 0, vec1[0], vec1[1], head_width=0.15, color='r')

enter image description here

все в порядке, за исключением того, что головка стрелки находится за пределами круга.

поэтому я изменяю vec1 безобразно

vec1 = [vunit-.1,vunit-.1]

enter image description here

фигура выглядит лучше, и я могу изменить vec1 более точно, но исправление кажется уродливым.есть ли способ изобразить стрелку внутри круга

Ответы [ 2 ]

6 голосов
/ 02 июля 2019

Использование length_includes_head=True:

import numpy as np
import matplotlib.pyplot as plt

vunit = 1/np.sqrt(2)
vec1 = [vunit,vunit]
thetas = np.arange(-np.pi, np.pi, .05)
coordinates = np.vstack((np.cos(thetas),np.sin(thetas)))

plt.figure(figsize = (6,6))
plt.xlim(-3,3)
plt.ylim(-3,3)
plt.scatter(coordinates[0,:],coordinates[1,:],s=.1)
plt.arrow(0, 0, vec1[0], vec1[1], head_width=0.15, color='r', length_includes_head=True)
plt.show()

enter image description here

1 голос
/ 02 июля 2019

Можно использовать FancyArrowPatch вместо FancyArrow (который является объектом, созданным plt.arrow).
Разница здесь незначительна, но для других случаев и, следовательно, для согласованности, FancyArrowPatch предлагает множество приятных функций, которых нет у FancyArrow. Одно главное отличие наблюдается при масштабировании графика; голова FancyArrow определена в координатах данных, поэтому она будет выглядеть перекошенной при отображении на неравных графиках.

enter image description here

Итак, вот полный код с FancyArrowPatch, где мы получаем наконечник головы в конечной координате через аргумент shrinkB.

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.patches import FancyArrowPatch

vunit = 1/np.sqrt(2)
vec1 = [vunit,vunit]
thetas = np.arange(-np.pi, np.pi, .05)
coordinates = np.vstack((np.cos(thetas),np.sin(thetas)))

plt.figure(figsize = (6,6))
plt.xlim(-3,3)
plt.ylim(-3,3)
plt.scatter(coordinates[0,:],coordinates[1,:],s=.1)

arrow = FancyArrowPatch(posA=(0,0), posB=vec1, 
                        arrowstyle='-|>', mutation_scale=20, 
                        shrinkA=0, shrinkB=0, color='r')
plt.gca().add_patch(arrow)

plt.show()

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...