Python plt.tight_布局车,长标题?

Python plt.tight_布局车,长标题?,python,matplotlib,Python,Matplotlib,问题: 为什么每一个plt.tight\u layout()在重新开始使用plt.clf()之后,都会使图形缩小一点 以这个片段为例: plt.figure(1).clf() plt.plot(range(10)) plt.title("Blah") plt.tight_layout() for _ in range(5): plt.figure(2).clf() plt.plot(range(10)) plt.title("Blah") plt.tight_l

问题:

为什么每一个
plt.tight\u layout()
在重新开始使用
plt.clf()
之后,都会使图形缩小一点

以这个片段为例:

plt.figure(1).clf()
plt.plot(range(10))
plt.title("Blah")
plt.tight_layout()

for _ in range(5):
    plt.figure(2).clf()
    plt.plot(range(10))
    plt.title("Blah")
    plt.tight_layout()
正如预期的那样,图1和图2是相同的

但是现在让标题变得很长:

plt.figure(3).clf()
plt.plot(range(10))
plt.title("Blahhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh")
plt.tight_layout()

for _ in range(5):
    plt.figure(4).clf()
    plt.plot(range(10))
    plt.title("Blahhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh")
    plt.tight_layout()
图3和图4不再相同,图4在水平方向上收缩,并且这种收缩随着环数的增加而增加

如果有人能解释这件事

一些背景信息:

你可能会问:“你到底为什么要把这样的绘图东西放在
for
循环中?”。实际上我没有,但我有一个互动脚本,我可以用一些变化重复同一个数字几次,这个收缩看起来是一样的

我的python版本是:

Python 2.7.11 |Anaconda 4.0.0 (64-bit)| (default, Feb 16 2016, 09:58:36) [MSC v.1500 64 bit (AMD64)]
顺便说一句,如果您将
plt.tight_layout()
调用的数量增加到足够多,您最终会得到一个错误:

Traceback (most recent call last):

  File "<ipython-input-89-1a59da108bdf>", line 5, in <module>
    plt.tight_layout()

  File "C:\Users\julien.bernu\AppData\Local\Continuum\Anaconda2\lib\site-packages\matplotlib\pyplot.py", line 1379, in tight_layout
    fig.tight_layout(pad=pad, h_pad=h_pad, w_pad=w_pad, rect=rect)

  File "C:\Users\julien.bernu\AppData\Local\Continuum\Anaconda2\lib\site-packages\matplotlib\figure.py", line 1756, in tight_layout
    self.subplots_adjust(**kwargs)

  File "C:\Users\julien.bernu\AppData\Local\Continuum\Anaconda2\lib\site-packages\matplotlib\figure.py", line 1612, in subplots_adjust
    self.subplotpars.update(*args, **kwargs)

  File "C:\Users\julien.bernu\AppData\Local\Continuum\Anaconda2\lib\site-packages\matplotlib\figure.py", line 226, in update
    raise ValueError('left cannot be >= right')

ValueError: left cannot be >= right
回溯(最近一次呼叫最后一次):
文件“”,第5行,在
plt.紧_布局()
文件“C:\Users\julien.bernu\AppData\Local\Continuum\Anaconda2\lib\site packages\matplotlib\pyplot.py”,第1379行,紧凑布局
图紧密布局(焊盘=焊盘,h焊盘=h焊盘,w焊盘=w焊盘,rect=rect)
文件“C:\Users\julien.bernu\AppData\Local\Continuum\Anaconda2\lib\site packages\matplotlib\figure.py”,第1756行,紧凑布局
自我调整子批次(**kwargs)
文件“C:\Users\julien.bernu\AppData\Local\Continuum\Anaconda2\lib\site packages\matplotlib\figure.py”,第1612行,在子地块中
self.subplotpars.update(*args,**kwargs)
更新中第226行的文件“C:\Users\julien.bernu\AppData\Local\Continuum\Anaconda2\lib\site packages\matplotlib\figure.py”
raise VALUERROR('左不能>=右')
ValueError:左不能>=右

清除图形时,图形保留其子PlotParams,该子PlotParams已通过调用
tight\u layout
进行调整

考虑以下代码:

import matplotlib.pyplot as plt

left = []; right = []
def print_subplotparams(sp):
    t = "left={left:.3f}, right={right:.3f}, top={top:.3f}, bottom={bottom:.3f}"
    t = t.format(left=sp.left, right=sp.right, top=sp.top, bottom=sp.bottom)
    left.append(sp.left); right.append(sp.right)
    print(t)

fig = plt.figure(1)
print_subplotparams(fig.subplotpars)
fig.clear()

for _ in range(8):
    fig = plt.figure(1)
    # uncomment to see difference
    #fig.subplots_adjust(left=0.125, right=0.900, top=0.880, bottom=0.110)
    plt.plot(range(10))
    plt.title("Blahhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh")
    plt.tight_layout()
    print_subplotparams(fig.subplotpars)
    fig.clear()

fig = plt.figure(2, figsize=(5,3))
plt.plot(range(len(left)), left, label="left")
plt.plot(range(len(right)), right, label="right")
plt.title("SubplotParams left/right as function of calls to tight_layout")
plt.xlabel("number of call to tight_layout")
plt.ylabel("left/right parameter")
plt.tight_layout()
plt.show()
产生:

可以看出,在每个循环步骤中,
tight_layout
根据已调整的参数进行调整,使其更小

为了防止出现这种情况,可以在每个步骤中重置子PlotParams

fig.subplots_adjust(left=0.125, right=0.900, top=0.880, bottom=0.110)
在这种情况下,
tight_layout
总是从相同的初始参数开始优化,并且它们的最终值不会改变


简单地说,不要在同一个图形上多次使用
tight\u layout
。它会一直“优化”一点,直到你得到一个非常不愉快的结果。@importanceofbeingerest肯定,但
tight\u layout
在其他方面非常方便。在每次迭代时,图形都会被清除,因此每次优化都应该是相同的。。。