This solution建议使用gridspec.GridSpec
代替plt.subplots
。但是,当我在子图之间共享轴时,我通常使用如下语法
fig, axes = plt.subplots(N, 1, sharex='col', sharey=True, figsize=(3,18))
当我使用sharex
时如何指定sharey
和GridSpec
?
答案 0 :(得分:53)
首先,只要您稍微不精确,就可以轻松解决原始问题。 调用tight_layout
后,只需将子图的顶部范围重置为默认:
fig, axes = plt.subplots(ncols=2, sharey=True)
plt.setp(axes, title='Test')
fig.suptitle('An overall title', size=20)
fig.tight_layout()
fig.subplots_adjust(top=0.9)
plt.show()
但是,要回答您的问题,您需要创建稍低级别的子图以使用gridspec。如果要复制隐藏共享轴(如subplots
),则需要手动执行此操作,方法是使用Figure.add_subplot
的sharey
参数并使用{{隐藏重复的刻度线1}}。
举个例子:
plt.setp(ax.get_yticklabels(), visible=False)
答案 1 :(得分:10)
Joe的选择给了我一些问题:前者与直接使用figure.tight_layout
而不是figure.set_tight_layout()
相关,后者则与一些后端相关( UserWarning:tight_layout :回到Agg渲染器)。但乔的回答肯定让我走向了另一个紧凑的选择。这是一个接近OP的问题的结果:
import matplotlib.pyplot as plt
fig, axes = plt.subplots(nrows=2, ncols=1, sharex='col', sharey=True,
gridspec_kw={'height_ratios': [2, 1]},
figsize=(4, 7))
fig.set_tight_layout({'rect': [0, 0, 1, 0.95], 'pad': 1.5, 'h_pad': 1.5})
plt.setp(axes, title='Test')
fig.suptitle('An overall title', size=20)
plt.show()