我可以在matplotlib中指定文本框的右下角吗?

时间:2018-04-20 03:42:54

标签: python matplotlib

有没有办法可以使用matplotlib指定文本框的右下角坐标?

我的框的代码是:

plt.text(x_max-2.7e+3, y_min+1e+5, box_text, style='italic',
        bbox={'facecolor':'white', 'alpha':0.5, 'pad':10})

并且为当前的情节产生了这个:

enter image description here

然而,这些坐标值是通过反复试验找到的,我的数据的范围和数量级也会因不同的情节而有所不同。我想要一种方法可以指定右下角的坐标文本框的一角为(x_max,y_min),它将自动从那里绘制框。

有没有办法做到这一点?

1 个答案:

答案 0 :(得分:4)

毫不奇怪,答案是肯定的。但是,有一种更简单的方法可以做你想要的。首先让我先介绍一下背景。

plt.text只是一个在当前轴上创建mpl.text.Text对象的包装器。不幸的是,Text基于文本对齐属性锚定自身,并且您无法指定要锚定的文本框的任意点。这是不幸的,因为关于如何使用轴tutorial(坐标系)而不是数据来定位文本有一整个transform

幸运的是,matplotlib.offsetbox中有一些辅助类可以完全按照您的要求进行操作。 tutorial中描述了这些类,示例库herehere中显示了几个相关示例。您正在寻找的特定课程是mpl.offsetbox.AnchoredText。您可以像这样设置文本框:

from matplotlib.offsetbox import AnchoredText

...

text_box = AnchoredText(box_text, frameon=True, loc=4, pad=0.5)
plt.setp(text_box.patch, facecolor='white', alpha=0.5)
plt.gca().add_artist(text_box)

frameon=True使文本后面的Patch可见。 loc=4在框的右下角与Axes排成一行。 pad现在以字体大小的分数为单位。 plt.setp是一个实用程序函数,用于一次在一堆对象上设置多个属性。在这种情况下,第一个参数只是一个补丁,但通常你会传入一系列要操作的东西。

由于您必须直接向Axes添加AnchoredText,我建议您切换到Object Oriented API。您的代码看起来非常相似,但您可以更直接地访问底层对象。您可以使用plt.subplots之类的东西创建图形和轴。然后,您将使用与通常pyplot methods对应的Axes方法绘制数据。你的代码看起来像这样:

from matplotlib import pyplot as plt
from matplotlib.offsetbox import AnchoredText

fig, ax = plt.subplots()

ax.plot(...)

text_box = AnchoredText(box_text, frameon=True, loc=4, pad=0.5)
plt.setp(text_box.patch, facecolor='white', alpha=0.5)
ax.add_artist(text_box)