Matplotlib:其bbox

时间:2015-12-04 11:29:52

标签: python matplotlib

我必须绘制一些数据和一些垂直线来划定有趣的间隔,然后我想使用text添加一些标签。我不能完全避免标签与数据或垂直线重叠,所以我决定在文本周围加上bbox以保持其可读性。我的问题是我无法在此框中集中对齐它,这在我看来是清晰可见的并且非常烦人。

我正在做这样的事情:

import numpy
import matplotlib
import matplotlib.pyplot as plt

fig=plt.figure()
plot=fig.add_subplot(111)
x=numpy.linspace(1,10,50)
y=numpy.random.random(50)
plot.plot(x,y)
plot.text(4.5,.5,'TEST TEST',\
          bbox={'facecolor':'white','alpha':1,'edgecolor':'none','pad':1})
plot.axvline(5,color='k',linestyle='solid')
plt.show()

创建以下图: enter image description here

很明显,文本不以bbox为中心。我怎么能改变这个?我花了很长时间在Google上,但我找不到任何东西。

修改

感谢到目前为止的建议。

This表明我所看到的实际上是所希望的行为。显然,bbox的新版本中matplotlib的选择考虑了它所包含的文本可能的最大下降('g'的下降)。

当文本中出现'g'时,这确实看起来很好: enter image description here 不幸的是,在我的情况下,没有'g'或任何类似下降的东西。有没有人有任何进一步的想法?

2 个答案:

答案 0 :(得分:4)

使用文本属性ha和va:

plot.text(5.5,.5,'TEST TEST TEST TEST',
          bbox={'facecolor':'white','alpha':1,'edgecolor':'none','pad':1},
          ha='center', va='center') 

要检查,请在地块中心画线:

plot.axvline(5.5,color='k',linestyle='solid')
plot.axhline(0.5,color='k',linestyle='solid')

答案 1 :(得分:1)

似乎现在有一些选项可以正确地在坐标系中position the text(特别是新的va = 'baseline')。但是,正如user35915指出的那样,这不会更改框相对于文本的对齐方式。在单个数字中,特别是在数字“ 1”中,这种未对准尤其明显(另请参见this bug)。在解决此问题之前,我的解决方法是手动放置矩形,而不是通过bbox参数:

import matplotlib.pyplot as plt
import matplotlib.patches as patches

# define the rectangle size and the offset correction
rect_w = 0.2
rect_h = 0.2
rect_x_offset = 0.004
rect_y_offset =0.006

# text coordinates and content
x_text = 0.5
y_text = 0.5
text = '1'

# create the canvas
fig,ax = plt.subplots(figsize=(1,1),dpi=120)
ax.set_xlim((0,1))
ax.set_ylim((0,1))

# place the text
ax.text(x_text, y_text, text, ha="center", va="center", zorder=10)
# compare: vertical alignment with bbox-command: box is too low.
ax.text(x_text+0.3, y_text, text, ha="center", va="center",
        bbox=dict(facecolor='wheat',boxstyle='square',edgecolor='black',pad=0.1), zorder=10)
# compare: horizontal alignment with bbox-command: box is too much to the left.
ax.text(x_text, y_text+0.3, text, ha="center", va="center",
        bbox=dict(facecolor='wheat',boxstyle='square',edgecolor='black',pad=0.2), zorder=10)
# create the rectangle (below the text, hence the smaller zorder)
rect = patches.Rectangle((x_text-rect_w/2+rect_x_offset, y_text-rect_h/2+rect_y_offset),
                         rect_w,rect_h,linewidth=1,edgecolor='black',facecolor='white',zorder=9)
# add rectangle to plot
ax.add_patch(rect)

# show figure
fig.show()

enter image description here