某些子图之间的间距,但不是全部

use*_*817 10 python matplotlib

我在python中有一个带有3个子图的matplotlib图,全部在1列中.

我目前控制每个子图的高度:

gridspec.GridSpec(3, 1, height_ratios=[1, 3, 3])
Run Code Online (Sandbox Code Playgroud)

我没有间距:

plt.subplots_adjust(hspace=0.0)
Run Code Online (Sandbox Code Playgroud)

但我想在第2行和第3行之间留一些间距.

在其他一个答案中,我读到我可以做类似的事情:

gs1.update(left=0.05, right=0.48, wspace=0)
Run Code Online (Sandbox Code Playgroud)

但我真的不明白发生了什么.有人可以给我更多信息吗?

Amy*_*den 14

当您调用update时,您将这些参数应用于该特定gridspec中的所有子图.如果要为不同的子图使用不同的参数,可以进行多个网格规范.但是,您需要确保它们的大小正确且不重叠.一种方法是使用嵌套的gridspecs.由于底部两个图的总高度是顶部的6倍,因此外部栅格将具有[1,6]的高度比.

import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec


def do_stuff(cell): #just so the plots show up
    ax = plt.subplot(cell)
    ax.plot()
    ax.get_xaxis().set_visible(False)
    ax.get_yaxis().set_visible(False)
plt.subplots_adjust(hspace=0.0)
#make outer gridspec
outer = gridspec.GridSpec(2, 1, height_ratios = [1, 6]) 
#make nested gridspecs
gs1 = gridspec.GridSpecFromSubplotSpec(1, 1, subplot_spec = outer[0])
gs2 = gridspec.GridSpecFromSubplotSpec(2, 1, subplot_spec = outer[1], hspace = .05)
for cell in gs1:
    do_stuff(cell)
for cell in gs2:
    do_stuff(cell)
plt.show()
Run Code Online (Sandbox Code Playgroud)

绘制三个子图


Joo*_*eey 9

在这种特殊情况下,在第 2 行和第 3 行之间添加一个不可见的轴对象可能是最快的:

import matplotlib.pyplot as plt

gridspec = dict(hspace=0.0, height_ratios=[1, 1, 0.4, 3])
fig, axs = plt.subplots(nrows=4, ncols=1, gridspec_kw=gridspec)
axs[2].set_visible(False)
Run Code Online (Sandbox Code Playgroud)

我查看了文档,似乎不支持可变网格间距。所以我们必须设法解决这样的问题。

子图