Python 自动展开长线画布
使用figtext()添加文本时如何(垂直)展开地物/绘图/地物 代码如下所示:Python 自动展开长线画布,python,matplotlib,Python,Matplotlib,使用figtext()添加文本时如何(垂直)展开地物/绘图/地物 代码如下所示: plt.figtext(0.5 ,0, u'first line\nsecond line\nthird line', ha='center') 所以我需要图像自动展开,以适应绘图、x轴标签和figtext。目前,文本第一行\第二行>第3行< /代码>是重叠的x轴标签。 至今还没有自动的方法,因为有很多可能要考虑的问题,例如在调整子图时应该考虑属于哪个图形的< 艺术家>代码> 现在,您可以根据具体情况手动执行此
plt.figtext(0.5 ,0, u'first line\nsecond line\nthird line', ha='center')
所以我需要图像自动展开,以适应绘图、x轴标签和figtext。目前,文本<代码>第一行\第二行>第3行< /代码>是重叠的x轴标签。 至今还没有自动的方法,因为有很多可能要考虑的问题,例如在调整子图时应该考虑属于哪个图形的< <代码>艺术家>代码> 现在,您可以根据具体情况手动执行此操作。您需要知道包含文本的框的大小。由于您知道地物文本位于底部,因此可以假定此文本框的顶部应视为地物的“新”底部 我使用
get_renderer
,由tight_layout
模块提供,以获取有关dpi中文本大小的适当信息
此示例说明了基本思想:
from matplotlib.tight_layout import get_renderer
import matplotlib.pyplot as plt
FONTSIZE=20
# set up example plots
fig = plt.figure()
ax1 = fig.add_subplot(211)
ax1.plot(range(10,1,-1))
ax1.set_title('ax1',fontsize=FONTSIZE)
ax1.set_xlabel('X axis',fontsize=FONTSIZE)
ax1.set_ylabel('Y axis',fontsize=FONTSIZE)
ax2 = fig.add_subplot(212)
ax2.plot(range(1,10,1))
ax2.set_title('ax1',fontsize=FONTSIZE)
ax2.set_xlabel('X axis',fontsize=FONTSIZE)
ax2.set_ylabel('Y axis',fontsize=FONTSIZE)
# tighten things up in advance
print "Subplots 'bottom' before tight_layout: ",fig.subplotpars.bottom
plt.tight_layout()
print "Subplots 'bottom' after tight_layout: ",fig.subplotpars.bottom
fig.savefig('noFigText.png')
# add and deal with text
bigFigText = plt.figtext(0.5 ,0.05,
u'first line\nsecond line\nthird line',
ha='center')
# textLimitsDpi is a 2x2 array correspoinding to [[x0,y0],[x1,y1]]
textLimitsDpi = bigFigText.get_window_extent(renderer=get_renderer(fig),
dpi=fig.get_dpi()).get_points()
# we really just need y1
textHeightFig = fig.transFigure.inverted().transform((0,textLimitsDpi[1,1]))[1]
# make adjustment to bottom
fig.subplots_adjust(bottom=fig.subplotpars.bottom+textHeightFig)
print "Subplots 'bottom' after figtext: ",fig.subplotpars.bottom
fig.savefig('withFigText.png')
plt.show()
结果是:
紧固件布局前的子地块“底部”:0.1
紧密布局后的子地块“底部”:0.10916667
figtext后的子批次“底部”:0.25916667
不带文本的紧凑布局图为:
但在添加文本时,会将其调整为:
hspace
子地块参数可能需要调整,具体取决于figtext文本框的大小。请注意,我垂直移动了文本(0.05),由于我使用文本框的y1
来调整底部的子批次参数,因此会考虑此调整
理想情况下,考虑到y范围的新下限(即不是0),您可能希望重做tight_layout所做的工作,但以下是一种适用于figtext文本框的大多数字体大小(8-48)的方法:
# make adjustment to bottom
top = fig.subplotpars.top
bottom = fig.subplotpars.bottom
newHspace = (fig.subplotpars.hspace
*(top-bottom)
/(top-bottom-textHeightFig))
fig.subplots_adjust(bottom=bottom+textHeightFig,
hspace=newHspace)
我不认为有一个自动的方式来实现这一点。通常,您必须自己调整边距。当使用
xlabel
添加文本时,可以通过callyngplt.tight_layout()
动态扩展画布,但不幸的是,这不适用于plt.figtext()
。还有一些解决方法-在xlabel
中添加一些换行符,但是我不喜欢它。