3

以前、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')

例

4

1 に答える 1

0
import matplotlib.pyplot as plt
from matplotlib.patches import FancyArrowPatch
from matplotlib.transforms import ScaledTranslation

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)


# shift size points over and size points down so you should be on radius
# a point is 1/72 inches
def trans_callback(event):
    dpi = fig.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
    arrows.set_transform(shadow_transform)


cid = fig.canvas.mpl_connect('resize_event', trans_callback)

また、ポイントの縁にあるポイントを取得する軸のアスペクト比について何かを含める必要があります (アスペクト比 = 1 でない限り、楕円のデータ単位でのマーカーの形状のため)。

于 2013-01-31T04:38:57.517 に答える