是否有一种简单的方法可以让pyplot将text()
或annotate()
的调用视为“数据”,这样它就会自动扩展轴限制以包含绘图边界内的文本(即,不在保证金中)?
# this creates a barplot with a significance bracket
# but the p-value above the bracket overlaps the plot title
import matplotlib.pyplot as plt
p = plt.subplot(1, 1, 1)
b = plt.bar((0, 1), (2, 3), yerr=(0.1, 0.2))
bracket = [[[0.4, 0.4], [2.5, 3.8]],
[[0.4, 1.4], [3.8, 3.8]],
[[1.4, 1.4], [3.4, 3.8]]]
for x, y in bracket:
p.plot(x, y, 'k')
txt = p.text(0.9, 4.0, 'p < 0.001', ha='center')
plt.title('A significant MWE')
我目前的解决方法包括创建文本,调用draw()
,获取文本的bbox_patch
范围,将这些范围转换为数据坐标,以及手动将轴对象的ybound
更改为某些内容大于改变的上部范围。这对我来说似乎相当迂回,我想知道是否有更简单的方法。
答案 0 :(得分:0)
这是我的解决方法。不雅,但功能齐全。如果有人有更好的方式,我仍然希望听到它。
txt.set_bbox(dict(facecolor='w', alpha=0, boxstyle='round, pad=1'))
plt.draw()
txtbb = txt.get_bbox_patch().get_window_extent()
ymax = p.transData.inverted().transform(txtbb).ravel()[-1]
ybnd = p.get_ybound()
if ymax > ybnd[-1]:
p.set_ybound(ybnd[0], ymax)
plt.draw()
plt.show()