Python 2.7 具有固定纵横比的子图形的gridspec

Python 2.7 具有固定纵横比的子图形的gridspec,python-2.7,matplotlib,matplotlib-basemap,Python 2.7,Matplotlib,Matplotlib Basemap,我使用mpl_toolkits.basemap(basemap),它返回具有固定纵横比的图形。我喜欢将Basemap中的一些图组合成一个图 问题:Basemap与gridspec结合使用会在子地块之间创建较大的空白 问题:在这种情况下,如何删除子地块之间的空白?或者,我可以让子图从顶部向底部填充图形,然后裁剪剩余的空白吗 一个要求是图形的宽度(例如,图的宽度=0.4)是A4页面的一小部分(即A4的宽度=21cm),而图形的高度需要较大,以便让底图自由缩放绘图 下面是两个示例,(a)一个具有大y轴

我使用mpl_toolkits.basemap(basemap),它返回具有固定纵横比的图形。我喜欢将Basemap中的一些图组合成一个图

问题:Basemap与gridspec结合使用会在子地块之间创建较大的空白

问题:在这种情况下,如何删除子地块之间的空白?或者,我可以让子图从顶部向底部填充图形,然后裁剪剩余的空白吗

一个要求是图形的宽度(例如,图的宽度=0.4)是A4页面的一小部分(即A4的宽度=21cm),而图形的高度需要较大,以便让底图自由缩放绘图

下面是两个示例,(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

紧凑的布局在这里似乎不起作用

# gs.tight_layout(f1)
引发错误:

'UserWarning:此图包含与紧密_布局不兼容的轴,因此其结果可能不正确。warnings.warn(“此图包括非”

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


似乎不可能用具有固定纵横比的图像自动填充给定的非均匀空间

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

  • 绘制你的图像
  • 看看你是否喜欢它的样子
  • 看起来不错吧?
    • 如果没有:更新设置并返回1
    • 如果是:你完成了

  • 似乎不可能用具有固定纵横比的图像自动填充给定的非均匀空间

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

  • 绘制你的图像
  • 看看你是否喜欢它的样子
  • 看起来不错吧?
    • 如果没有:更新设置并返回1
    • 如果是:你完成了

  • 如果结果看起来像你想要的,我不明白方法(b)有什么错。你能更精确地说明你的要求吗?方法(b)是可以的,但是我必须看几次图,直到我得到一个近似的最小值(甚至是x和y的值)单个子地块之间的空白。我主要好奇的是,是否有其他方法来处理固定纵横比,这需要更少的手动调整。因此本质上,
    fig\u height
    可能是0到1之间的任何值,问题是你不想自己找到该值?!
    布局是否紧凑或者只是发出警告?是正常(而非底图)绘图与
    紧凑布局一起满足这些要求的结果吗?您是否总是使用相同的网格(如3x4)或者这种情况会改变吗?你是否总是拥有相同的方面图像,或者解决方案是否应该独立于图像的方面?我现在还没有解决方案的想法,但这些都是潜在回答者应该知道的重要事情。谢谢,我会尽力提供所有有用的信息。[1]是的,
    fig_height
    可能是一个介于0和1之间的值,1表示该图形有A4高度,0表示没有高度。[2]似乎
    tight_布局
    并不总是发出该警告,但是如果像
    gs.tight_布局(f1)
    [3]那样运行,它只会影响最后一个子批次我无法使用gridspec和contourf强制
    aspect='equal'
    。然而,相等的纵横比是一项要求。[4]网格大小不同,n x m,取决于我要查看的区域大小。[5]每个子地块的纵横比相同,图形之间的纵横比可能会变化,但始终是“相等的”,1度纬度与1度经度。[6]我可能希望稍后使用另一个仍然固定的纵横比,其中我有纬度与米。[7]我将宽度固定为A4宽度,以便在图形包含在文本中时具有可读的标签。(tikz格式可能会解决我的问题,我只是没有时间学习/理解它,然后让它运行)。[8]错误:我的数字宽度似乎不符合我的预期。现在无法查看它。我不明白方法(b)有什么问题如果结果看起来像是你想要的。你能更精确地说明你的要求吗?方法(b)是可以的,但是我必须看几次这个数字,直到我得到一个近似的最小值(甚至是x和y的值)单个子地块之间的空白。我主要好奇的是,是否有其他方法来处理固定纵横比,这需要更少的手动调整。因此本质上,
    fig\u height
    可能是0到1之间的任何值,问题是你不想自己找到该值?!
    布局是否紧凑或者只是发出警告?是正常(而非底图)绘图与
    紧凑布局一起满足这些要求的结果吗?您是否总是使用相同的网格(如3x4)或者这种情况会改变吗?你是否总是拥有相同的方面图像,或者解决方案是否应该独立于图像的方面?我现在还没有解决方案的想法,但这些都是潜在回答者应该知道的重要事情。谢谢,我会尽力提供所有有用的信息。[1]是的,
    fig_height
    可能是一个介于0和1之间的值,1表示该图形有A4高度,0表示没有高度。[2]似乎
    tight_布局
    并不总是发出该警告,但是如果像
    gs.tight_布局(f1)
    [3]那样运行,它只会影响最后一个子批次我无法使用gridspec和contourf强制
    纵横比class='equal'
    。但是,要求纵横比相等。[4]网格大小不同,n x m,取决于我要查看的区域大小。[5]每个子地块的纵横比相同,
    # gs.tight_layout(f1)
    
    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')