当我使用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。

最佳答案

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

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

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

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


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

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

我们观察到轴和间距有最大尺寸。单元格数量越多,最大可能大小越小。同样,轴越大,间距越小,反之亦然。这很好地解释了为什么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()


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

关于python - 如何使用matplotlib/gridspec修改子图之间的宽度?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52725687/

10-16 10:58