Matplotlib图形边框与文本显示范围不一致问题咨询
问题
我发现下述Matplotlib代码的运行结果存在异常:
import matplotlib.pyplot as plt fig, ax = plt.subplots() plt.text(1.3, 1.3, "ABC", color = 'red') # Add blue border # fig.patch.set_linewidth(3) fig.patch.set_edgecolor("blue") fig.text(0, 1, "DEF", color = 'red') plt.show() plt.close() fig.patch.set_linewidth(3) fig.patch.set_edgecolor("blue") fig.text(0, 1, "DEF") plt.show() plt.close()
当使用plt.text在图形上限1以外添加文本时,蓝色边框会扩展以容纳右上角的文本;但同为figure对象方法的fig.text却将文本放置在原本的图形上限位置。请问为何同属fig的方法会出现这种不一致,如何让fig.text自动适配新增文本?
原因分析
plt.text()本质是Axes对象的方法(等同于ax.text()),它默认使用Axes坐标系(x、y范围默认0-1)。当传入超出Axes默认范围的坐标(比如(1.3,1.3))时,Matplotlib会自动调整Axes的边界范围,整个Figure的大小会跟着Axes的调整扩展,所以蓝色边框(Figure的边框)会随之变大。fig.text()是Figure对象的方法,默认使用Figure坐标系(x、y范围0-1,对应Figure的左下角到右上角)。传入的(0,1)本身就在Figure的原始范围内,不会触发Axes或Figure的边界调整,自然不会让边框扩展。
解决方法
要让fig.text()自动适配文本,有两种可行思路:
方法1:手动触发布局适配
在调用plt.show()前,使用fig.tight_layout()让Figure自动调整布局,适配所有元素:
import matplotlib.pyplot as plt fig, ax = plt.subplots() fig.patch.set_linewidth(3) fig.patch.set_edgecolor("blue") # 传入超出原始Figure范围的坐标 fig.text(0, 1.1, "DEF", color='red') fig.tight_layout() # 自动调整布局容纳文本 plt.show() plt.close()
方法2:给fig.text指定Axes坐标系
通过transform参数将fig.text的坐标系改为Axes的transAxes,这样它就会像ax.text一样,在坐标超出范围时触发边界调整:
import matplotlib.pyplot as plt fig, ax = plt.subplots() fig.patch.set_linewidth(3) fig.patch.set_edgecolor("blue") # 指定使用Axes坐标系 fig.text(0, 1.3, "DEF", color='red', transform=ax.transAxes) plt.show() plt.close()
内容的提问来源于stack exchange,提问作者Dave
相关产品推荐
相关产品推荐

