gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 08:57:05 25 4
gpt4 key购买 nike

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

enter image description here

我们观察到轴和间距存在最大尺寸。细胞数量越多,最大可能尺寸越小。此外,轴越大,间距越小,反之亦然。这很好地解释了为什么 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()

enter image description here

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com