毫不奇怪,答案是肯定的。但是,有一种更简单的方法可以做你想做的事。让我先介绍一下背景。
plt.text 只是一个在当前坐标区上创建mpl.text.Text 对象的包装器。不幸的是,Text 基于文本对齐属性锚定自身,您不能指定文本框的任意点来锚定。这是不幸的,因为有一个完整的tutorial 是关于如何使用轴transform(坐标系)而不是数据来定位文本。
幸运的是,matplotlib.offsetbox 中有一些帮助类可以完全满足您的需求。这些类在tutorial 中进行了描述,示例库here 和here 中显示了几个相关示例。您正在寻找的特定课程是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 是一个实用函数,可以一次在一堆对象上设置多个属性。在这种情况下,第一个参数只是一个补丁,但通常你会传入一个要操作的东西的列表。
由于您必须将AnchoredText 直接添加到Axes,我建议切换到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)