2016-12-22 10 views
1

my previous questionから続きます。テキストラベルボックスの座標がFigureの小数点座標にあり、同じ方法で矢印パッチの座標を取得しようとしました。Matplotlib注釈の矢印の座標を取得

しかし、私は同じで、それはそれの上に位置しない座標上で、私はラインをプロットするときので、矢印に対応していない取得座標:

import numpy as np 
import matplotlib 
matplotlib.use('agg') 
import matplotlib.pyplot as plt 

def f(x): 
    return 10 * np.sin(3*x)**4 

x = np.linspace(0, 2*np.pi, 100) 
y = f(x) 

fig, ax = plt.subplots() 
ax.plot(x,y) 

xpt = 1.75 
ypt = f(xpt) 
xy = ax.transData.transform([xpt, ypt]) 
xy = fig.transFigure.inverted().transform(xy) 

xytext = xy + [0.1, -0.1] 
rdx, rdy = 0, 1 
ann = ax.annotate('A point', xy=xy, xycoords='figure fraction', 
      xytext=xytext, textcoords='figure fraction', 
      arrowprops=dict(arrowstyle='->', connectionstyle="arc3", 
          relpos=(rdx, rdy)), 
      bbox=dict(fc='gray', edgecolor='k', alpha=0.5), 
      ha='left', va='top' 
      ) 
fig.canvas.draw() 

leader_line_box = ann.arrow_patch.get_extents() 
print(leader_line_box) 
leader_line_box = fig.transFigure.inverted().transform(leader_line_box) 
print(leader_line_box) 

from matplotlib.lines import Line2D 
line = Line2D(leader_line_box.T[0], leader_line_box.T[1],transform=fig.transFigure, lw=2, color='m') 
ax.add_line(line) 

plt.savefig('test.png') 

enter image description here

どのようにすることができます注釈の矢印の座標が図の小数点以下の桁で((x0,y0), (x1,y1))になってしまいましたが、ここでは何が間違っていましたか?

+0

私はそれがあなたの言うことを正確にしていると思います。矢印の境界ボックスの左下から右上に線をプロットします。線を矢印と揃えたい場合は、 '[:: - 1]'を入れてxdataまたはydataのどちらかを反転させることができます。それらはあなたが探していた座標ではありませんか?あなたはどこに線を描きたいのですか? – whrrgarbl

+0

Hmm - あなたが正しいと思います。私が本当に望むのは、尾の座標と矢自体の頭です。 – xnx

答えて

1

この非常に具体的なケースでは、最も簡単な方法は、ちょうど逆

のx座標を描画することです
line = Line2D(leader_line_box.T[0][::-1], leader_line_box.T[1],transform=fig.transFigure, lw=2, color='m') 

あなたは、より一般的な解決策が必要な場合は、

verts = ann.arrow_patch.get_path()._vertices 
tverts= fig.transFigure.inverted().transform(verts) 
index = [0,2] 
line = Line2D([tverts[index[0],0],tverts[index[1],0]], [tverts[index[0],1],tverts[index[1],1]], 
       transform=fig.transFigure, lw=2, color='m') 
ax.add_line(line) 

これは矢印方向(上向きまたは下向き、東向きまたは西向き)で動作しますが、引数arrowstyle='->'およびconnectionstyle="arc3"に固有です。異なる矢印スタイルまたは接続スタイルを使用する場合は、に格納されている配列から適切なインデックスを選択することによって見つけることができる異なる値にindexを設定する必要があります。

box = ann.arrow_patch._posA_posB 
tbox = fig.transFigure.inverted().transform(leader_line_box) 
print tbox 
line = Line2D(tbox.T[0], tbox.T[1],transform=fig.transFigure) 

しかし、これはあなたに注釈付きのポイントとテキスト自体の間に線を取得します:1は、以下で見ることができる非常に一般的なケースでは


。一般に、この線は、使用中の矢印スタイルに応じて実際の矢印とは異なる場合があります。

1

ほとんどの場合、矢印の境界ボックスの座標があります。これは、矢印を対角線として使用して描かれたボックスです。これから、頭/尾の座標を見つけることができます。

バウンディングボックスの座標は、[[left, bottom], [right, top]]の順番で与えられます。ここで、矢頭は左上にあり、尾は右下にあります。そこで、これらを視覚的にマークするために2行を描くことができます。次のプロットで

from matplotlib.lines import Line2D 
dl = 0.01 # some arbitrary length for the marker line 
head = [leader_line_box.T[0][0], leader_line_box.T[1][1]] 
line_head = Line2D([head[0],head[0]+dl], [head[1],head[1]+dl], 
    transform=fig.transFigure, lw=2, color='r') # mark head with red 
ax.add_line(line_head) 

tail = [leader_line_box.T[0][1], leader_line_box.T[1][0]] 
line_tail = Line2D([tail[0],tail[0]+dl], [tail[1],tail[1]+dl], 
    transform=fig.transFigure, lw=2, color='g') # mark tail with green 
ax.add_line(line_tail) 

結果:これであなたのコードでその部分を交換

plot with arrow head and tail marked

関連する問題