以前、matplotlib-user メーリング リストで質問したので、クロスポストをお詫びします。
ポイント単位で既知のサイズのマーカーがあり、このポイントに矢印を描きたいとします。矢印の終点を取得するにはどうすればよいですか? 以下でわかるように、マーカーと重なっています。端っこに行きたい。シュリンクAとシュリンクBを使ってやりたいことはできますが、それらがポイントサイズ**.5とどのように関連しているかわかりません。または、2 つのポイントとポイント自体の間の既知の角度を使用して、何らかの方法で変換を行う必要があります。ポイントをデータ座標に変換し、特定の方向に size**.5 ポイントだけオフセットする方法がわかりません。誰でもこれを解決するのを助けることができますか?
import matplotlib.pyplot as plt
from matplotlib.patches import FancyArrowPatch
point1 = (138.21, 19.5)
x1, y1 = point1
point2 = (67.0, 30.19)
x2, y2 = point2
size = 700
fig, ax = plt.subplots()
ax.scatter(*zip(point1, point2), marker='o', s=size)
# if I need to get and use the angles
dx = x2 - x1
dy = y2 - y1
d = np.sqrt(dx**2 + dy**2)
arrows = FancyArrowPatch(posA=(x1, y1), posB=(x2, y2),
color = 'k',
arrowstyle="-|>",
mutation_scale=700**.5,
connectionstyle="arc3")
ax.add_patch(arrows)
編集:もう少し進歩しました。Translations Tutorialを正しく読めば、マーカーの半径のポイントがわかります。ただし、軸のサイズを変更するとすぐに変換がオフになります。他に何を使おうか迷っています。
from matplotlib.transforms import ScaledTranslation
# shift size points over and size points down so you should be on radius
# a point is 1/72 inches
dpi = ax.figure.get_dpi()
node_size = size**.5 / 2. # this is the radius of the marker
offset = ScaledTranslation(node_size/dpi, -node_size/dpi, fig.dpi_scale_trans)
shadow_transform = ax.transData + offset
ax.plot([x2], [y2], 'o', transform=shadow_transform, color='r')