有什么方法可以使用 matplotlib 指定文本框的右下角坐标吗?
我的盒子的代码是:
plt.text(x_max-2.7e+3, y_min+1e+5, box_text, style='italic',
bbox={'facecolor':'white', 'alpha':0.5, 'pad':10})
Run Code Online (Sandbox Code Playgroud)
并为当前的情节产生这个:
然而,这些坐标值是通过反复试验找到的,对于不同的图,我的数据的范围和数量级也会有所不同。我想要一种可以指定右下角坐标的方法文本框为 (x_max, y_min) ,它会自动从那里绘制框。
有没有办法做到这一点?
毫不奇怪,答案是肯定的。但是,有一种更简单的方法可以做您想做的事。让我先从一些背景开始。
plt.text只是一个mpl.text.Text在当前轴上创建对象的包装器。不幸的是,Text锚定本身基于文本对齐属性,您不能指定文本框的任意点来锚定。这是不幸的,因为有一个关于如何使用轴变换(坐标系)而不是数据来定位文本的完整教程。
幸运的是,有一些帮助类matplotlib.offsetbox可以完全满足您的需求。教程中描述了这些类,此处和此处的示例库中显示了几个相关示例。您正在寻找的特定类是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)
Run Code Online (Sandbox Code Playgroud)
frameon=True使Patch后面的文字可见。loc=4将框的右下角与 的右下角对齐Axes。pad现在以您字体大小的分数为单位。plt.setp是一个实用函数,可以一次在一堆对象上设置多个属性。在这种情况下,第一个参数只是一个补丁,但通常您会传入要操作的事物列表。
由于您必须AnchoredText直接向 an添加Axes,我建议切换到面向对象的 API。您的代码看起来非常相似,但您可以更直接地访问底层对象。您将使用类似plt.subplots. 然后,您将使用Axes与通常的pyplot 方法相对应的方法绘制数据。您的代码如下所示:
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)
Run Code Online (Sandbox Code Playgroud)