具有固定宽高比的子图的gridspec

时间:2017-02-06 16:51:55

标签: python-2.7 matplotlib matplotlib-basemap

我使用mpl_toolkits.basemap(Basemap)返回固定宽高比的数字。我喜欢将一些来自Basemap的图组合成一个图。

问题:与gridspec结合使用的底图会在子图之间创建大的空白区域。

问题:在这种情况下,如何删除子图之间的空白区域?或者,我可以让子图从顶部到底部填充图形,然后在左边的白色空间上裁剪吗?

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

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

$

(a)现在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

enter image description here

tight_layout似乎无法在这里工作

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')

引发错误:

  

&#39; UserWarning:此图包含与tight_layout不兼容的轴,因此其结果可能不正确。 warnings.warn(&#34;此图包括非&#34;&#39;

的轴

(b)手动设置y轴长度(不需要,但结果还可以):

# gs.tight_layout(f1)

enter image description here

1 个答案:

答案 0 :(得分:0)

似乎无法使用具有固定宽高比的图像自动填充给定的非均匀空间。

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

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