随着绘制的图像数量的增加,防止matplotlib减小绘制图像的大小

时间:2018-03-20 03:50:12

标签: python matplotlib

我正在使用以下代码绘制一些图像:

start, end = 0, 3
fig = plt.figure(figsize=(25, 25))
n_cols = 3
n_rows = len(images_dict[start:end])
for i, d in enumerate(images_dict[start:end]):
    ax1 = fig.add_subplot(n_rows, n_cols, n_cols * i + 1)
    ax2 = fig.add_subplot(n_rows, n_cols, n_cols * i + 2)
    ax3 = fig.add_subplot(n_rows, n_cols, n_cols * i + 3)
    ax1.imshow(d['filled'])
    ax1.set_title(d['name'])
    ax2.imshow(d['img'])
    ax3.imshow(d['overlay'])

我正在使用上面的代码绘制9个图像,每行3个图像(虽然第3行被截断):

enter image description here

现在,如果我想要绘制20行,只需将end变量更改为20即可:

enter image description here

我想知道当我增加绘制的图像数量时是否有办法阻止matplotlib减小绘图图像的大小?

1 个答案:

答案 0 :(得分:1)

作为第一次粗略估计,图形尺寸需要与每个方向上的图像数量成比例,即如果您将图像数量加倍,则需要将图形尺寸加倍。

这当然只是部分正确,因为它没有考虑图像周围的边距。

因此,解决方案类似于Python: Showing multiple images in one figure WITHOUT scalingHow to combine gridspec with plt.subplots() to eliminate space between rows of subplots

您需要根据每个子图的大小加上边距和间距来计算图形大小。如果我们假设所有图像都具有相同的大小,您可以简化此计算,并指定图像应以英寸为单位的大小(同时考虑纵横比)。

import matplotlib.pyplot as plt
import numpy as np
plt.rcParams["font.size"]=8

start, end = 0, 6
n_cols = 3
n_rows = (end-start)

lx,ly = 200,180
def get_image(i):
    return np.random.rayleigh((i+1.)/(end-start)/n_cols, size=(ly, lx, 3))


margin = 0.3 #inch
spacing =0.1 #inch
imsize = 0.6 #inch

figwidth=n_cols*imsize+(n_cols-1)*spacing+2*margin
figheight=n_rows*imsize*ly/lx+(n_rows-1)*spacing+2*margin

left=margin/figwidth
bottom = margin/figheight

fig, axes = plt.subplots(nrows=(end-start),ncols=n_cols, sharex=True, sharey=True)
fig.set_size_inches(figwidth,figheight)
fig.subplots_adjust(left=left, bottom=bottom, right=1.-left, top=1.-bottom, 
                    wspace=spacing/imsize, hspace=spacing/imsize*lx/ly)

for i, ax in enumerate(axes.flatten()):
    ax.imshow(get_image(i))

plt.savefig("imgrid{}.png".format(end))
plt.show()

使用end=3

enter image description here

使用end=6

enter image description here