Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 自动展开长线画布_Python_Matplotlib - Fatal编程技术网

Python 自动展开长线画布

Python 自动展开长线画布,python,matplotlib,Python,Matplotlib,使用figtext()添加文本时如何(垂直)展开地物/绘图/地物 代码如下所示: plt.figtext(0.5 ,0, u'first line\nsecond line\nthird line', ha='center') 所以我需要图像自动展开,以适应绘图、x轴标签和figtext。目前,文本第一行\第二行>第3行< /代码>是重叠的x轴标签。 至今还没有自动的方法,因为有很多可能要考虑的问题,例如在调整子图时应该考虑属于哪个图形的< 艺术家>代码> 现在,您可以根据具体情况手动执行此

使用figtext()添加文本时如何(垂直)展开地物/绘图/地物

代码如下所示:

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
添加文本时,可以通过callyng
plt.tight_layout()
动态扩展画布,但不幸的是,这不适用于
plt.figtext()
。还有一些解决方法-在
xlabel
中添加一些换行符,但是我不喜欢它。