我正在做一个项目,我需要把10行和3列的情节网格。虽然我已经能够使情节和安排的子情节,我不能产生一个很好的情节没有白色空间,如这一个下面从gridspec documentatation.
。
我尝试了以下帖子,但仍然无法完全删除白色空间的例子图像。有人能给我给予吗?谢谢你,谢谢
这是我的形象:
下面是我的代码。The full script is here on GitHub .注:images_2和images_fool都是形状为(1032,10)的展平图像的numpy数组,而delta是形状为(28,28)的图像数组。
def plot_im(array=None, ind=0):
"""A function to plot the image given a images matrix, type of the matrix: \
either original or fool, and the order of images in the matrix"""
img_reshaped = array[ind, :].reshape((28, 28))
imgplot = plt.imshow(img_reshaped)
# Output as a grid of 10 rows and 3 cols with first column being original, second being
# delta and third column being adversaril
nrow = 10
ncol = 3
n = 0
from matplotlib import gridspec
fig = plt.figure(figsize=(30, 30))
gs = gridspec.GridSpec(nrow, ncol, width_ratios=[1, 1, 1])
for row in range(nrow):
for col in range(ncol):
plt.subplot(gs[n])
if col == 0:
#plt.subplot(nrow, ncol, n)
plot_im(array=images_2, ind=row)
elif col == 1:
#plt.subplot(nrow, ncol, n)
plt.imshow(w_delta)
else:
#plt.subplot(nrow, ncol, n)
plot_im(array=images_fool, ind=row)
n += 1
plt.tight_layout()
#plt.show()
plt.savefig('grid_figure.pdf')
5条答案
按热度按时间p3rjfoxz1#
开头的注解:如果你想完全控制间距,请避免使用
plt.tight_layout()
,因为它会试图将图中的图平均分布。这大多是罚款和产生愉快的结果,但调整间距在其意愿。您从Matplotlib示例库中引用的GridSpec示例运行良好的原因是子图的方面没有预定义。也就是说,子图将简单地在网格上扩展,并使设置的间距(在本例中为
wspace=0.0, hspace=0.0
)与图形大小无关。与此相反,您正在使用
imshow
打印图像,并且图像的纵横比默认设置为相等(相当于ax.set_aspect("equal")
)。也就是说,您当然可以将set_aspect("auto")
放入每个图中(并额外添加wspace=0.0, hspace=0.0
作为GridSpec的参数,如图库示例中所示),这将产生一个没有间距的图。然而,当使用图像时,保持相等的纵横比是很有意义的,这样每个像素的宽度和高度一样,正方形阵列显示为正方形图像。
你需要做的就是调整图像大小和图边距以获得预期的结果。figure的
figsize
参数是以英寸为单位的数字(宽度,高度),这里可以使用两个数字的比例。子图参数wspace, hspace, top, bottom, left
可以手动调整,以给予所需的结果。下面是一个例子:编辑:
当然,不需要手动调整参数是可取的。因此,可以根据行和列的数量计算出一些最佳的。
csbfibhn2#
尝试在代码中添加以下行:
对于每个轴对象集:
8xiog9wr3#
下面是ImportanceOfBeingErnest的回答,但如果你想使用
plt.subplots
及其功能:tsm1rwdh4#
如果你使用matplotlib.pyplot.subplots,你可以使用Axes数组显示任意多的图像。您可以通过对matplotlib.pyplot.subplots配置进行一些调整来删除图像之间的空格。
由于我们首先在这里创建子图,因此我们可以使用gridspec_kw参数(source)为grid_spec给予一些参数。在这些参数中,“top = 1,bottom = 0,right = 1,left = 0,hspace = 0,wspace = 0”参数将防止图像间的间距。要查看其他参数,请访问这里。
我通常在设置上面的figure_size时使用像(30,15)这样的figure size。我对此进行了一点概括,并将其添加到代码中。如果您愿意,可以在此处输入手动尺寸。
wkyowqbh5#
下面是使用ImageGrid类(改编自this answer)的另一种简单方法。