【问题标题】:How to modify width between subplots with matplotlib/gridspec?如何使用 matplotlib/gridspec 修改子图之间的宽度?
【发布时间】:2018-10-10 04:01:22
【问题描述】:

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

【问题讨论】:

    标签: python matplotlib


    【解决方案1】:

    我认为像 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()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-17
      • 1970-01-01
      • 2021-06-27
      • 2015-09-20
      • 2017-04-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多