我使用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
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)
答案 0 :(得分:0)
似乎无法使用具有固定宽高比的图像自动填充给定的非均匀空间。
因此,解决方案是令人失望的 - 手动迭代: