有没有办法可以使用matplotlib指定文本框的右下角坐标?
我的框的代码是:
plt.text(x_max-2.7e+3, y_min+1e+5, box_text, style='italic',
bbox={'facecolor':'white', 'alpha':0.5, 'pad':10})
并且为当前的情节产生了这个:
然而,这些坐标值是通过反复试验找到的,我的数据的范围和数量级也会因不同的情节而有所不同。我想要一种方法可以指定右下角的坐标文本框的一角为(x_max,y_min),它将自动从那里绘制框。
有没有办法做到这一点?
答案 0 :(得分:4)
毫不奇怪,答案是肯定的。但是,有一种更简单的方法可以做你想要的。首先让我先介绍一下背景。
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
是一个实用程序函数,用于一次在一堆对象上设置多个属性。在这种情况下,第一个参数只是一个补丁,但通常你会传入一系列要操作的东西。
由于您必须直接向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)