Cómo combinar gridspec con plt.subplots () para eliminar espacio entre filas de subplots

Intento trazar múltiples imágenes en subttwigs y eliminar el espacio entre las subttwigs (horizontal y vertical) o controlarlo. Traté de usar la sugerencia en Cómo usar GridSpec … También intenté aquí pero no están utilizando subplots (): espacio entre subplots Puedo eliminar el espacio horizontal pero no el espacio vertical con lo que estoy haciendo en el siguiente código. No marques como duplicado ya que he probado las otras publicaciones y no hacen lo que quiero. Mi código se muestra a continuación. Tal vez hay otro argumento de palabras clave que necesito en el diccionario gridspec_kw? Quiero usar plt.subplots () no plt.subplot () para esto. En caso de que importe, las imágenes no son cuadradas, son rectangulares. También intenté agregar f.tight_layout(h_pad=0,w_pad=0) antes de plt.show () pero no cambió nada.

 def plot_image_array_with_angles(img_array,correct_angles,predict_angles, fontsize=10,figsize=(8,8)): ''' Imports: import matplotlib.gridspec as gridspec import numpy as np import matplotlib.pyplot as plt ''' num_images = len(img_array) grid = int(np.sqrt(num_images)) # will only show all images if square #f, axarr = plt.subplots(grid,grid,figsize=figsize) f, axarr = plt.subplots(grid,grid,figsize=figsize, gridspec_kw={'wspace':0,'hspace':0}) im = 0 for row in range(grid): for col in range(grid): axarr[row,col].imshow(img_array[im]) title = 'cor = ' + str(correct_angles[im]) + ' pred = ' + str(predict_angles[im]) axarr[row,col].set_title(title,fontsize=fontsize) axarr[row,col].axis('off') # turns off all ticks #axarr[row,col].set_aspect('equal') im += 1 plt.show() return 

La relación de aspecto de un gráfico imshow se establece automáticamente de forma que los píxeles de la imagen se cuadran. Esta configuración es más fuerte que cualquiera de las configuraciones de gridspec o gridspec para el espaciado. O en otras palabras, no se puede controlar directamente el espaciado entre las subttwigs si esas subttwigs tienen su aspecto establecido en "equal" .

La primera solución obvia es establecer el aspecto de la imagen en ax.set_aspect("auto") . Esto resuelve el problema del espaciado de subttwigs, pero distorsiona las imágenes.

La otra opción es ajustar los márgenes de las figuras y el tamaño de la figura de manera que el espacio entre las subplots sea el deseado.

Digamos que figw y figw son la altura y el ancho de la figura en pulgadas, y s el ancho de la subttwig en pulgadas. Los márgenes son bottom , top , left y right (en relación con el tamaño de la figura) y los espaciados hspace en vertical y wspace en dirección horizontal (en relación con el tamaño de la subttwig). El número de filas se denota n el número de columnas m . El aspect es la relación entre la subplot (imagen), altura y ancho ( aspect = image height / image width ).

Entonces las dimensiones se pueden configurar a través de

 fig, axes = plt.subplots(nrows=n, ncols=m, figsize=(figwidth, figheight)) plt.subplots_adjust(top=top, bottom=bottom, left=left, right=right, wspace=wspace, hspace=hspace) 

Los valores respectivos se pueden calcular de acuerdo con:

enter image description here

O, si los márgenes son los mismos:

enter image description here

Un ejemplo:

 import matplotlib.pyplot as plt image = plt.imread("https://i.stack.imgur.com/9qe6z.png") aspect = image.shape[0]/float(image.shape[1]) print aspect n = 2 # number of rows m = 4 # numberof columns bottom = 0.1; left=0.05 top=1.-bottom; right = 1.-left fisasp = (1-bottom-(1-top))/float( 1-left-(1-right) ) #widthspace, relative to subplot size wspace=0.15 # set to zero for no spacing hspace=wspace/float(aspect) #fix the figure height figheight= 3 # inch figwidth = (m + (m-1)*wspace)/float((n+(n-1)*hspace)*aspect)*figheight*fisasp fig, axes = plt.subplots(nrows=n, ncols=m, figsize=(figwidth, figheight)) plt.subplots_adjust(top=top, bottom=bottom, left=left, right=right, wspace=wspace, hspace=hspace) for ax in axes.flatten(): ax.imshow(image) ax.set_title("title",fontsize=10) ax.axis('off') plt.show() 

enter image description here