在tight_layout

时间:2017-10-25 14:38:27

标签: python matplotlib

我想尽量减少图中的空白区域。我有一排子图,其中四个图共享他们的y轴,最后一个图有一个单独的轴。 共享轴中间面板没有ylabels或ticklabels。

tight_layout在中间图之间创建了大量的空白区域,就好像为标记标签和ylabels留下了空间,但我宁愿拉伸子图。这可能吗?

import matplotlib.gridspec as gridspec
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

fig = plt.figure()
gs = gridspec.GridSpec(1, 5, width_ratios=[4,1,4,1,2]) 

ax = fig.add_subplot(gs[0])
axes = [ax] + [fig.add_subplot(gs[i], sharey=ax) for i in range(1, 4)]

axes[0].plot(np.random.randint(0,100,100))
barlist=axes[1].bar([1,2],[1,20])

axes[2].plot(np.random.randint(0,100,100))
barlist=axes[3].bar([1,2],[1,20])

axes[0].set_ylabel('data')

axes.append(fig.add_subplot(gs[4]))
axes[4].plot(np.random.randint(0,5,100))
axes[4].set_ylabel('other data')


for ax in axes[1:4]:
    plt.setp(ax.get_yticklabels(), visible=False)


sns.despine();
plt.tight_layout(pad=0, w_pad=0, h_pad=0);

enter image description here

1 个答案:

答案 0 :(得分:4)

设置w_pad = 0并未更改tight_layout的默认设置。您需要设置w_pad = -2之类的内容。这产生了下图:

enter image description here

你可以走得更远,说-3然后你会开始与你上一个情节重叠。

另一种方法是删除plt.tight_layout()并使用

自行设置边界
plt.subplots_adjust(left=0.065, right=0.97, top=0.96, bottom=0.065, wspace=0.14)

虽然这可能是一个试错过程。

修改

通过将刻度线和最后一个绘图的标签移动到右侧,可以实现漂亮的图形。 This回答显示您可以使用以下方式执行此操作:

ax.yaxis.tick_right()
ax.yaxis.set_label_position("right") 

所以对你的例子来说:

axes[4].yaxis.tick_right()
axes[4].yaxis.set_label_position("right")

此外,您需要删除sns.despine()。最后,现在无需设置w_pad = -2,只需使用plt.tight_layout(pad=0, w_pad=0, h_pad=0)

使用此按钮可创建下图:

enter image description here