2016-12-21 12 views
1

Matplotlibプロットに対するテキスト注釈の境界矩形の座標をFigureの小数点座標で知りたいと思います。しかし、注釈に関連付けられたパッチの「エクステント」にアクセスしようとすると、テキストラベルのサイズに関係なくBbox(x0=-0.33, y0=-0.33, x1=1.33, y1=1.33)が得られます。これらの座標はIdentityTransformに関連付けられているように見えますが、意味のある部分座標には変換されません。 図の小数部でラベルの座標(理想的には左下隅と右上隅)を取得するにはどうすればよいですか?図形座標でのMatplotlib注釈ラベルの座標の取得

例:

import numpy as np 
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' 
      ) 

enter image description here

patch = ann.get_bbox_patch() 
print(patch.get_extents()) 

与える:

[[-0.33 -0.33] 
[ 1.33 1.33]] 

c = patch.get_transform().transform(patch.get_extents()) 
print(c) 

を与える:

[[-211.2 -158.4] 
[ 851.2 638.4]] 

おそらく、これらは表示座標ですが、プロパティを必要とするラベルの位置とサイズには対応していません。

答えて

2

図が描画される前に、textオブジェクトの境界ボックスには、内部のテキストを基準にしたボックスの座標だけが含まれています。

したがって、図を最初に描画してから境界ボックスにアクセスする必要があります。

fig.canvas.draw() 
patch = ann.get_bbox_patch() 
box = patch.get_extents() 
print box 
#prints: Bbox(x0=263.6, y0=191.612085684, x1=320.15, y1=213.412085684) 

ものは表示ユニットのボックスの座標であるので、単位

を理解するtranformedする必要
tcbox = fig.transFigure.inverted().transform(box) 
print tcbox 
#prints [[ 0.411875 0.39919185] 
#  [ 0.50023438 0.44460851]] 

# The format is 
#  [[ left bottom] 
#   [ right top ]] 

これは、(0から1までの範囲)、図単位のバウンディングボックスを返しテキストの周りの長方形のテキスト自体の代わりにバウンディングボックスの場合


は1つが matplotlib.text.Textget_window_extent()メソッドを使用し、引数として注釈オブジェクトを供給することができますを求めbeeingているものです。

box = matplotlib.text.Text.get_window_extent(ann) 
print box 
# prints Bbox(x0=268.0, y0=196.012085684, x1=315.75, y1=209.012085684) 

図の単位でボックスを得るために上記の手順を実行できます。

+0

ありがとう - 私は問題があります: 'plt.show()'の後に正しいbbox座標を再現できるだけです: 'fig.canvas.draw()'を呼び出すだけでは不十分です...これはバックエンドの問題?私はOS Xを使っています。 – xnx

+0

私はMacで何の経験もしていないので、この方法はバックエンド 'agg'、' TkAgg'、 'Qt4Agg'を使ってWindowsのmatplotlib 1.5で動作するとしか言えません。 – ImportanceOfBeingErnest

+0

Yup - Mac OS Xバックエンドのバグです。 'agg'でうまく動作します。ご協力いただきありがとうございます。 – xnx

関連する問題