这种对另一个线程的解决方案建议使用gridspec.GridSpec
而不是plt.subplots
。但是,当我在子图之间共享轴时,通常使用如下语法
fig, axes = plt.subplots(N, 1, sharex='col', sharey=True, figsize=(3,18))
如何指定sharex
和sharey
使用时间GridSpec
?
Answers:
首先,只要您可以稍微精确一点就可以,对于您的原始问题,有一个更简单的解决方法。只需在调用后将子图的最高范围重置为默认值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。如果要像dos一样复制共享轴的隐藏,subplots
则需要手动执行此操作,方法是使用sharey
to参数,Figure.add_subplot
并使用来隐藏重复的刻度plt.setp(ax.get_yticklabels(), visible=False)
。
举个例子:
import matplotlib.pyplot as plt
from matplotlib import gridspec
fig = plt.figure()
gs = gridspec.GridSpec(1,2)
ax1 = fig.add_subplot(gs[0])
ax2 = fig.add_subplot(gs[1], sharey=ax1)
plt.setp(ax2.get_yticklabels(), visible=False)
plt.setp([ax1, ax2], title='Test')
fig.suptitle('An overall title', size=20)
gs.tight_layout(fig, rect=[0, 0, 1, 0.97])
plt.show()
Joe的两个选择都给我带来了一些问题:前者与直接使用offigure.tight_layout
而不是figure.set_tight_layout()
and有关,后者与一些后端有关(UserWarning:ight_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()