Ame*_*ina 55 python matplotlib
另一个线程的解决方案建议使用gridspec.GridSpec
而不是plt.subplots
.但是,当我在子图之间共享轴时,我通常使用如下语法
fig, axes = plt.subplots(N, 1, sharex='col', sharey=True, figsize=(3,18))
Run Code Online (Sandbox Code Playgroud)
我如何指定sharex
以及sharey
何时使用GridSpec
?
Joe*_*ton 58
首先,只要你稍微不精确就可以解决原始问题.调用后,只需将子图的顶部范围重置为默认值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()
Run Code Online (Sandbox Code Playgroud)
但是,要回答您的问题,您需要创建稍低级别的子图以使用gridspec.如果你想像那样复制共享轴的隐藏subplots
,你需要手动执行,通过使用sharey
参数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()
Run Code Online (Sandbox Code Playgroud)
khy*_*yox 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()
Run Code Online (Sandbox Code Playgroud)