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:
O, si los márgenes son los mismos:
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()