我试图在matplotlib.pyplot
中模仿legend
方法,其中可以使用loc='lower right'
来定位图例框 * 固定并正确对齐 *,而不管框的轴和内容如何。
使用text
是过时的,因为这需要手动输入坐标,而我追求的是自动化。
我试过使用annotate,它让我走了一半的路,但它仍然不能正常工作。
这是我到目前为止所拥有的:
import matplotlib.pyplot as plt
# Define some names and variables to go in the text box.
xn, yn, cod = 'r', 'p', 'abc'
prec = 2
ccl = [546.35642, 6785.35416]
ect = [12.5235, 13.643241]
fig = plt.figure()
ax = fig.add_subplot(111)
plt.xlim(-1., 10.)
plt.ylim(-1., 1.)
# Generate text to write.
text1 = "${}_{{t}} = {:.{p}f} \pm {:.{p}f}\; {c}$".format(xn, ccl[0],
ect[0], c=cod, p=prec)
text2 = "${}_{{t}} = {:.{p}f} \pm {:.{p}f}\; {c}$".format(yn, ccl[1],
ect[1], c=cod, p=prec)
text = text1 + '\n' + text2
ax.annotate(text, xy=(0.75, 0.9), xycoords='axes fraction', fontsize=10,
bbox=dict(facecolor='white', alpha=0.8),
horizontalalignment='left', verticalalignment='bottom')
plt.savefig('annotate_test.png', dpi=150)
字符串
这导致:
x1c 0d1x的数据
这将正确缩放以更改轴限制,但问题是:1-如果轴设置为ax.set_aspect('equal')
,则会失败:
的
和2-如果文本太长,它将失败(这里我在上面的MWE中设置prec=5
):
的
如何告诉matplotlib
将文本框 * 始终放置在右上角并正确对齐 *,使其不会落在图像之外(即:loc
在legend
中的作用)?
1条答案
按热度按时间wd2eg0qa1#
快速和肮脏的方法是使用右对齐和上对齐的文本,并将其放置在轴角的固定偏移点处:
字符串
的数据
因为我们已经指定了顶部和右侧对齐,所以它适用于您的两个边缘情况:
的
的
这样做的缺点是文本右对齐。理想情况下,您希望文本对齐方式与框对齐方式分开。
matplotlib.offsetbox
模块有很多方法来处理这样的事情。如果你想模仿一个图例框(包括位置代码),可以看看
matplotlib.offsetbox.AnchoredText
。(注意,您可以通过pad
和borderpad
kwargs调整填充等:http://matplotlib.org/api/offsetbox_api.html#matplotlib.offsetbox.AnchoredOffsetbox)型
的
这样做的一个缺点是,调整结果的字体和框参数有点违反直觉。
AnchoredText
接受字体参数字典作为prop
kwarg。在初始化后,可以通过patch
属性调整框。举个简单的例子:型
的