subplots_adjust subplots multiple examples example add_subplot python-3.x matplotlib

python-3.x - subplots - subplot python examples



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

Estoy tratando de trazar varias imágenes en subtramas y eliminar el espacio entre subtramas (horizontal y vertical) o controlarlo. Traté de usar la sugerencia en Cómo usar GridSpec .... También probé aquí, pero no están usando subplots (): espacio entre subplots. Puedo eliminar el espacio horizontal pero no el espacio vertical con lo que estoy haciendo en el siguiente código. Por favor, no marque como duplicado como he probado las otras publicaciones y no hacen lo que quiero. Mi código se muestra a continuación. ¿Quizás hay otro argumento de palabra clave que necesito en el diccionario gridspec_kw? Quiero usar plt.subplots () no plt.subplot () para esto. En caso de que sea importante, 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 de imshow se establece automáticamente de manera que los píxeles de la imagen estén al cuadrado. Esta configuración es más fuerte que cualquiera de las configuraciones gridspec o gridspec para el espaciado. O, en otras palabras, no puede controlar directamente el espacio entre las subtramas si esas subtramas tienen su aspecto establecido en "equal" .

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

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

Digamos que figw e figw son la altura y el ancho de la figura en pulgadas, y s el ancho de la subtrama en pulgadas. Los márgenes son bottom , top , left y right (en relación con el tamaño de la figura) y los hspace separación hspace en vertical y wspace en dirección horizontal (en relación con el tamaño de la subtrama). El número de filas se denota n el número de columnas m . El aspect es la relación entre la altura y el ancho de la subtrama (imagen) ( 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()