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

2jcobegt  于 2023-11-22  发布在  其他
关注(0)|答案(1)|浏览(169)

当我用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)

字符串
一个解决方法是增加网格规格的单元格数量,并在子图之间放置空单元格,但我想知道为什么改变wspace不能完成这项工作?
在Linux集群上使用python 2.7和matplotlib 1.5.1。

mwyxok5s

mwyxok5s1#

我觉得100这样的数字没有任何意义,那意味着空间应该是子情节的100倍。
这个图是7英寸宽。考虑到12.5%的左边距和10%的右边距,你剩下5.425英寸来分配到子图。让我们称之为s
如果子图(或格网像元)为n,则确定空间和像元大小的公式为

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

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


的数据
我们观察到,轴和间距都有一个最大值。单元格的数量越多,最大值越小。而且,轴越大,间距越小,反之亦然。这很好地解释了为什么wspace=10和100之间没有区别。
我在图中标记了0.6英寸的尺寸。假设这是你需要的最小间距,以英寸为单位,这样标签就不会重叠。从图中我们可以看出,这只有在n等于9或更小的情况下才有可能。因此,18个单元格的网格将永远不允许在给定的图尺寸中不重叠的标签。
除了使用较大的数字外,你当然可以减少单元格的数目。
由于问题示例中使用的任何数字都是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()


相关问题