matplotlib - subplot python
¿Cómo mostrar correctamente múltiples imágenes en una figura? (2)
Esta pregunta ya tiene una respuesta aquí:
- Múltiples figuras en una sola ventana 4 respuestas.
Estoy tratando de mostrar 20 imágenes al azar en una sola figura. Las imágenes se muestran, pero se superponen. Estoy usando:
import numpy as np
import matplotlib.pyplot as plt
w=10
h=10
fig=plt.figure()
for i in range(1,20):
img = np.random.randint(10, size=(h,w))
fig.add_subplot(i,2,1)
plt.imshow(img)
plt.show()
Me gustaría que aparezcan naturalmente en un diseño de cuadrícula (por ejemplo, 4x5), cada uno con el mismo tamaño. Parte del problema es que no sé qué significan los argumentos para add_subplot. La documentación indica que los argumentos son el número de filas, el número de columnas y el número de trazado. No hay argumento de posicionamiento. Además, el número de parcela solo puede ser 1 o 2. ¿Cómo puedo lograr esto?
Aquí está mi enfoque que puedes probar:
import numpy as np
import matplotlib.pyplot as plt
w=10
h=10
fig=plt.figure(figsize=(8, 8))
columns = 4
rows = 5
for i in range(1, columns*rows +1):
img = np.random.randint(10, size=(h,w))
fig.add_subplot(rows, columns, i)
plt.imshow(img)
plt.show()
La imagen resultante:
(Fecha original de respuesta: 7 de octubre de 17 a 4:20)
Edit1
Ya que esta respuesta es popular más allá de mis expectativas. Y veo que se necesita un pequeño cambio para permitir la flexibilidad para la manipulación de las parcelas individuales. Para que ofrezco esta nueva versión al código original. En esencia, proporciona:
- Acceso a ejes individuales de subparcelas.
- posibilidad de trazar más características en ejes / subtrama seleccionados
Nuevo código:
import numpy as np
import matplotlib.pyplot as plt
w = 10
h = 10
fig = plt.figure(figsize=(9, 13))
columns = 4
rows = 5
# prep (x,y) for extra plotting
xs = np.linspace(0, 2*np.pi, 60) # from 0 to 2pi
ys = np.abs(np.sin(xs)) # absolute of sine
# ax enables access to manipulate each of subplots
ax = []
for i in range( columns*rows ):
img = np.random.randint(10, size=(h,w))
# create subplot and append to ax
ax.append( fig.add_subplot(rows, columns, i+1) )
ax[-1].set_title("ax:"+str(i)) # set title
plt.imshow(img, alpha=0.25)
# do extra plots on selected axes/subplots
# note: index starts with 0
ax[2].plot(x, 3*y)
ax[19].plot(y**2, x)
plt.show() # finally, render the plot
La trama resultante:
Podrías probar lo siguiente:
import matplotlib.pyplot as plt
import numpy as np
def plot_figures(figures, nrows = 1, ncols=1):
"""Plot a dictionary of figures.
Parameters
----------
figures : <title, figure> dictionary
ncols : number of columns of subplots wanted in the display
nrows : number of rows of subplots wanted in the figure
"""
fig, axeslist = plt.subplots(ncols=ncols, nrows=nrows)
for ind,title in zip(range(len(figures)), figures):
axeslist.ravel()[ind].imshow(figures[title], cmap=plt.jet())
axeslist.ravel()[ind].set_title(title)
axeslist.ravel()[ind].set_axis_off()
plt.tight_layout() # optional
# generation of a dictionary of (title, images)
number_of_im = 20
w=10
h=10
figures = {''im''+str(i): np.random.randint(10, size=(h,w)) for i in range(number_of_im)}
# plot of the images in a figure, with 5 rows and 4 columns
plot_figures(figures, 5, 4)
plt.show()
Sin embargo, esto es básicamente solo copiar y pegar desde aquí: varias figuras en una sola ventana, razón por la cual esta publicación debe considerarse como un duplicado.
Espero que esto ayude.