2013-07-23 89 views
6

如何獲取下圖中顯示的框的座標?matplotlib中註釋框的座標

enter image description here

fig, ax = subplots() 
x = ax.annotate('text', xy=(0.5, 0), xytext=(0.0,0.7), 
       ha='center', va='bottom', 
       bbox=dict(boxstyle='round', fc='gray', alpha=0.5), 
       arrowprops=dict(arrowstyle='->', color='blue')) 

我試圖檢查此對象的屬性,但我無法找到適合這個目的。有一個叫get_bbox_patch()屬性,它可能是在正確的軌道上,但是,我得到的結果在不同的座標系(或關聯到不同的屬性)

y = x.get_bbox_patch() 
y.get_width() 
63.265625 

非常感謝!

+0

我建議你閱讀本:http://matplotlib.org/users/transforms_tutorial.html你想要什麼單位的座標? – tacaswell

+0

已經做到了。我沒有太多幫助,因爲它顯示瞭如何將座標轉換爲不同的參考系統,但不是寬度或高度。我想我想要「數據座標」。 –

+0

懷疑寬度是在顯示座標中,寬度只是兩點之間的差異,所以如果你可以做座標,你可以做寬度。這個盒子放在你放置它的地方,你只需要抓住你想要的變換(它們會倒過來)。 – tacaswell

回答

5
ax.figure.canvas.draw() 
bbox = x.get_window_extent() 

將返回Bbox對象在顯示單元的文本(draw是必要的,這樣的文字渲染,實際上有一個顯示大小)。然後,您可以使用變換將其轉換爲您想要的任何座標系。 防爆

bbox_data = ax.transData.inverted().transform(bbox) 
+0

謝謝。這似乎是對的。你有沒有注意到輸出座標與xytext座標不匹配?不過,它們似乎是成比例的。例如,xytext =(0.0,1.0)給出[[-0.11196657 0.83225806] [-0.06034526 0.87258065]] –

+0

我回來了'[[-0.02608367 1.] [0.02608367 1.03385417]]'。記住這是邊界框,所以它將取決於你的'ha'和'va'設置。 – tacaswell

+0

你是對的。但是,我仍然在y座標上得到0.8。你可以添加你試過的代碼嗎?也許有一個額外的論點需要考慮。 –

1

您的問題也有一個預先的問題:

  • 當你寫How can I get the coordinates of the box displayed in the following plot?,哪個座標系,你是什麼意思?

默認annotate使用xytext = None, defaults to xy, and if textcoords = None, defaults to xycoords完成。

由於您沒有指定座標系。您的註釋位於默認系統上。你可以指定數據的座標,這對於一些目的就足夠了:

x = ax.annotate('text', xy=(0.5, 0), xytext=(0.0,0.7), 
       ha='center', va='bottom', textcoords='data', xycoords="data", 
       bbox=dict(boxstyle='round', fc='gray', alpha=0.5), 
       arrowprops=dict(arrowstyle='->', color='blue')) 

爲了找到座標系統,你可以這樣做:

In [39]: x.xycoords 
Out[39]: 'data' 

,並獲得座標:

In [40]: x.xytext 
Out[40]: (0.0, 0.7) 

In [41]: x.xy 
Out[41]: (0.5, 0) 

PS不直接相關,但輸出是從IPython,如果你仍然不使用它,它可以提高你在Python中開發的方式並使用matplotlib。試一試。

+0

謝謝。正如我所說的,數據座標很好。不過,我看不出如何獲得基於xytext的框的座標。其實,我已經在測試不同的屬性時做了這個。是的,我一直使用Ipython筆記本。你有沒有嘗試過qtconsole作爲便箋? –