matplotlib

matplotlib - subplot python



¿Cómo mostrar correctamente múltiples imágenes en una figura? (2)

Esta pregunta ya tiene una respuesta aquí:

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:

  1. Acceso a ejes individuales de subparcelas.
  2. 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.