具有固定纵横比的子图的 gridspec

gridspec with subfigures that have fixed aspect ratio

我使用 mpl_toolkits.basemap(底图),其中 returns 具有固定纵横比的图形。我喜欢将 Basemap 中的几张图组合成一张图。

问题: Basemap 与 gridspec 相结合在子图之间创建大的白色 spaces。

问题: 在这种情况下,如何去除子图之间的白色 space?或者,我可以让子图从上到下填充图形,然后将左侧裁剪成白色 space?

一个要求是图形的宽度(例如fig_width=0.4)是A4页的一小部分(即A4_width=21cm ), 而图形的高度需要很大才能让 Basemap 自由缩放绘图。

下面是两个示例,(a) 一个具有较大的 y 轴长度,(b) 一个手动选择 y 轴长度以接近所需结果。

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
from mpl_toolkits.basemap import Basemap

def plot_figure(fig):
    x = np.arange(20)
    y = np.arange(10)
    Z = np.outer(y, x)
    nrow,  ncol  = 0, 0 # counter for axis position from gridspec
    nrows, ncols = 6, 4 # number of gridspec columns and rows
    ax = {}
    for n in xrange(11):
        # use gridspec for the wspace and hspace options
        gs = gridspec.GridSpec(nrows = nrows, ncols = ncols)
        gs.update(left=0.05, right=0.48, wspace=0.1, hspace=0.1)
        ax[str(n).zfill(2)] = plt.subplot(gs[nrow, ncol])
        # plot with Basemap
        width, height, lat_ts, lat_0, lon_0 = 2.5e6, 1.2e6, 5., 5., 10.
        m = Basemap(width = width, height = height, resolution = 'c', projection = 'laea',
                    lat_ts = lat_ts, lat_0 = lat_0, lon_0 = lon_0)
        X,  Y  = np.meshgrid(x, y)
        mX, mY = m(X, Y)
        parallels = m.drawparallels(np.arange(-10.,30.,5.), labels=[1,0,0,0] if ncol == 0 else [0,0,0,0])
        meridians = m.drawmeridians(np.arange(-20.,20.,5.), labels=[0,0,1,0] if nrow == 0 else [0,0,0,0])
        cf = m.contourf(mX, mY, Z);
        # go through the axis coordinates
        if ncol < ncols - 1 :
            ncol += 1
        else :
            ncol = 0
            nrow += 1

A4_width, A4_height = 21 / 2.54, 29.5 / 2.54

(a) 现在 y 轴长度较大(需要,但错误):

fig_width, fig_height = 0.85, 1.0
f1 = plt.figure(figsize=( fig_width * A4_width, fig_height * A4_height))
plot_figure(f1)
plt.savefig('f1.pdf', format='pdf', bbox_inches='tight')

tight_layout这里好像不行

# gs.tight_layout(f1)

引发错误:

'UserWarning: This figure includes Axes that are not compatible with tight_layout, so its results might be incorrect. warnings.warn("This figure includes Axes that are not "'

(b) 手动设置 y 轴长度(不需要,但结果正常):

fig_width, fig_height = 0.85, 0.4
f2 = plt.figure(figsize=( fig_width * A4_width, fig_height * A4_height))
plot_figure(f2)
plt.savefig('f2.pdf', format='pdf', bbox_inches='tight')

似乎无法使用具有固定纵横比的图像自动填充给定的 space 非均匀图像。

因此,令人失望的是,解决方案是手动迭代:

  1. 绘制图像
  2. 检查您是否喜欢它的外观
  3. 好看吗?
    • 如果不是:更新您的设置并返回到 1。
    • 如果是:你完成了。