2013-07-23 91 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作为便笺? –