如何使用matplotlib / gridspec修改子图之间的宽度?

时间:2018-10-09 16:41:08

标签: python matplotlib

当我使用matplotlib和gridspec在python中创建带有子图的图形时,我遇到的问题是我无法适当地调整子图之间的间距。

虽然hspace参数的变体已经可以在0到1的范围内正常工作,但我必须将wspace的变化幅度最大为100,才能在其中进行一些移动,但我不能将其设置得足够高,以使y轴标签不触及其子图的左侧。

这是最小的工作量。我还尝试更改figsize中的宽度,但这只是使子图更宽/更小,并且不影响它们之间的间隔。

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

fig = plt.figure(figsize=([7,4]))

gs = gridspec.GridSpec(2,18)
gs.update(wspace=100., hspace=0.3)

ax1 = plt.subplot(gs[0,:6])
ax1.set_ylabel('ylabel', labelpad=0, fontsize=12)

ax2 = plt.subplot(gs[0,6:12])
ax2.set_ylabel('ylabel', labelpad=0, fontsize=12)

ax3 = plt.subplot(gs[0,12:18])
ax3.set_ylabel('ylabel', labelpad=0, fontsize=12)

ax4 = plt.subplot(gs[1,3:9])
ax4.set_ylabel('ylabel', labelpad=0, fontsize=12)

ax5 = plt.subplot(gs[1,9:15])
ax5.set_ylabel('ylabel', labelpad=0, fontsize=12)

一种解决方法是增加gridspec的单元数并在子图之间放置空单元,但是我想知道为什么变化的wspace不能完成这项工作?

在Linux群集上使用python 2.7和matplotlib 1.5.1。

1 个答案:

答案 0 :(得分:0)

我认为100之类的数字根本没有意义。这意味着空间应该是子图的100倍。

该图宽7英寸。考虑到左边缘的12.5%和右边缘的10%,您剩下的5.425英寸可以分散到子图上。我们称这个大小为s

具有n个子图(或网格像元),确定空间和像元大小的方程为

 s = n*axw + (n-1)*axw*wspace 

axw是单位为英寸的单元格大小。我们可以使用该公式来可视化给定的图形尺寸和一堆单元格(n),轴尺寸和间距以英寸为单位,取决于wspace

enter image description here

我们观察到,轴和间距最大。单元格数量越多,最大可能大小越小。同样,轴越大,间距越小,反之亦然。这很好地解释了为什么wspace = 10和100之间没有区别。

我在图中标出了0.6英寸的尺寸。假设这是您需要的最小间距(以英寸为单位),以使标签不重叠。从图中可以看出,只有n等于9或更小时才有可能。因此,由18个像元组成的网格将永远不允许在给定图形尺寸下使用不重叠的标签。

Appart使用较大的数字,当然可以减少单元数。

由于问题示例中使用的任何数字均为3的倍数,因此可以将网格简化为具有相同属性的较小网格。在这种情况下,正确设置空间。例如。 wspace=1.5(即比单元格大50%)

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

fig = plt.figure(figsize=([7,4]))

gs = gridspec.GridSpec(2,6)
gs.update(wspace=1.5, hspace=0.3)

ax1 = plt.subplot(gs[0,:2])
ax1.set_ylabel('ylabel', labelpad=0, fontsize=12)

ax2 = plt.subplot(gs[0,2:4])
ax2.set_ylabel('ylabel', labelpad=0, fontsize=12)

ax3 = plt.subplot(gs[0,4:6])
ax3.set_ylabel('ylabel', labelpad=0, fontsize=12)

ax4 = plt.subplot(gs[1,1:3])
ax4.set_ylabel('ylabel', labelpad=0, fontsize=12)

ax5 = plt.subplot(gs[1,3:5])
ax5.set_ylabel('ylabel', labelpad=0, fontsize=12)

plt.show()

enter image description here