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()