具有固定纵横比的子图的 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。
- 如果是:你完成了。
我使用 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。
- 如果是:你完成了。