Python 紧密布局后调整matplotlib子批次间距

Python 紧密布局后调整matplotlib子批次间距,python,matplotlib,Python,Matplotlib,我想最小化图中的空白。我有一行子图,其中四个图共享y轴,最后一个图有一个单独的轴。 共享轴中间面板没有标签 紧密的_布局在中间图之间创建了大量空白,好像为记号标签和标签留出了空间,但我更愿意拉伸子图。这可能吗 import matplotlib.gridspec as gridspec import numpy as np import matplotlib.pyplot as plt import seaborn as sns fig = plt.figure() gs = gridspec

我想最小化图中的空白。我有一行子图,其中四个图共享y轴,最后一个图有一个单独的轴。 共享轴中间面板没有标签

紧密的_布局在中间图之间创建了大量空白,好像为记号标签和标签留出了空间,但我更愿意拉伸子图。这可能吗

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);
设置w_pad=0不会更改紧密布局的默认设置。您需要设置w_pad=-2之类的值。这将生成下图:

你可以更进一步,比如说-3,但是你会开始和上一个情节有一些重叠

另一种方法是删除plt.tight_布局,并使用

plt.subplots_adjust(left=0.065, right=0.97, top=0.96, bottom=0.065, wspace=0.14)
虽然这可能是一个尝试和错误的过程

编辑

通过将最后一个绘图的记号和标签移到右侧,可以获得一个好看的图形。答案显示您可以通过以下方式完成此操作:

ax.yaxis.tick_right()
ax.yaxis.set_label_position("right") 
以你为例:

axes[4].yaxis.tick_right()
axes[4].yaxis.set_label_position("right")
此外,您还需要删除sns.skidene。最后,现在不需要设置w_pad=-2,只需使用plt.tight_layoutpad=0,w_pad=0,h_pad=0

使用此选项可创建下图:

设置w_pad=0不会更改紧密布局的默认设置。您需要设置w_pad=-2之类的值。这将生成下图:

你可以更进一步,比如说-3,但是你会开始和上一个情节有一些重叠

另一种方法是删除plt.tight_布局,并使用

plt.subplots_adjust(left=0.065, right=0.97, top=0.96, bottom=0.065, wspace=0.14)
虽然这可能是一个尝试和错误的过程

编辑

通过将最后一个绘图的记号和标签移到右侧,可以获得一个好看的图形。答案显示您可以通过以下方式完成此操作:

ax.yaxis.tick_right()
ax.yaxis.set_label_position("right") 
以你为例:

axes[4].yaxis.tick_right()
axes[4].yaxis.set_label_position("right")
此外,您还需要删除sns.skidene。最后,现在不需要设置w_pad=-2,只需使用plt.tight_layoutpad=0,w_pad=0,h_pad=0

使用此选项可创建下图:


谢谢这看起来更好,但最后一个ylabel与第二个至最后一个面板的条已经有了实质性的重叠。我希望能有办法给最后一个面板更多的水平空间?事实上,在我的例子中,字体越大,问题就越严重。我不确定你是否能做到,至少我不知道我的想法。可能有一个其他人可能知道的非平凡的解决方案。一个解决办法可能是将最后一个绘图的记号和标签移到右侧?@jlarsch请查看我的更新答案,以了解另一个可能的解决方案。对于这样的痛苦,我感到非常抱歉。我真的很喜欢这个改进版,但我希望所有面板的标记边缘都有轴线和记号。基本上正是我上面情节的美学,但最后一个轴在左边。我曾尝试使用sns。设置_风格的“记号”,但我无法移除刺和sns。斯皮恩一直将轴恢复到左侧…谢谢!这看起来更好,但最后一个ylabel与第二个至最后一个面板的条已经有了实质性的重叠。我希望能有办法给最后一个面板更多的水平空间?事实上,在我的例子中,字体越大,问题就越严重。我不确定你是否能做到,至少我不知道我的想法。可能有一个其他人可能知道的非平凡的解决方案。一个解决办法可能是将最后一个绘图的记号和标签移到右侧?@jlarsch请查看我的更新答案,以了解另一个可能的解决方案。对于这样的痛苦,我感到非常抱歉。我真的很喜欢这个改进版,但我希望所有面板的标记边缘都有轴线和记号。基本上正是我上面情节的美学,但最后一个轴在左边。我曾尝试使用sns。设置_样式的“ticks”,但我无法移除脊椎和sns。斯皮恩一直将轴恢复到左侧。。。