Matplotlib: ¿Cómo trazar imágenes en lugar de puntos?

Quiero leer una lista de imágenes en Python / Matplotlib y luego trazar estas imágenes en lugar de otros marcadores (como puntos) en una gráfica. Lo he intentado con Imshow pero no lo he logrado, porque no puedo cambiar la imagen a otra posición y escalarla adecuadamente. Tal vez alguien tenga una buena idea:) ¡Debería verse de alguna manera así! (Sin el Bob Esponja, pero con datos muy serios, por supuesto!)

Related of "Matplotlib: ¿Cómo trazar imágenes en lugar de puntos?"

Hay dos maneras de hacer esto.

  1. imshow la imagen usando imshow con la extent kwarg establecida en función de la ubicación en la que desea que se encuentre la imagen.
  2. Use una OffsetImage dentro de un AnnotationBbox .

La primera es la más fácil de entender, pero la segunda tiene una gran ventaja. kEl enfoque del cuadro de anotación permitirá que la imagen permanezca en un tamaño constante a medida que se acerca. Al usar imshow se vinculará el tamaño de la imagen a las coordenadas de datos del trazado.

Aquí hay un ejemplo de la segunda opción:

 import numpy as np import matplotlib.pyplot as plt from matplotlib.offsetbox import OffsetImage, AnnotationBbox from matplotlib.cbook import get_sample_data def main(): x = np.linspace(0, 10, 20) y = np.cos(x) image_path = get_sample_data('ada.png') fig, ax = plt.subplots() imscatter(x, y, image_path, zoom=0.1, ax=ax) ax.plot(x, y) plt.show() def imscatter(x, y, image, ax=None, zoom=1): if ax is None: ax = plt.gca() try: image = plt.imread(image) except TypeError: # Likely already an array... pass im = OffsetImage(image, zoom=zoom) x, y = np.atleast_1d(x, y) artists = [] for x0, y0 in zip(x, y): ab = AnnotationBbox(im, (x0, y0), xycoords='data', frameon=False) artists.append(ax.add_artist(ab)) ax.update_datalim(np.column_stack([x, y])) ax.autoscale() return artists main() 

introduzca la descripción de la imagen aquí

Si quieres diferentes imágenes:

Esta es ahora la primera respuesta cuando se busca en Google “matplotlib scatter with images”. Si eres como yo y realmente necesitas trazar diferentes imágenes en cada imagen, prueba este ejemplo minimalizado. Solo asegúrate de ingresar tus propias imágenes.

 import matplotlib.pyplot as plt from matplotlib.offsetbox import OffsetImage, AnnotationBbox def getImage(path,zoom=0.1): return OffsetImage(plt.imread(path),zoom=zoom) paths = [ 'a.jpg', 'b.jpg', 'c.jpg', 'd.jpg', 'e.jpg'] x = [0,1,2,3,4] y = [0,1,2,3,4] fig, ax = plt.subplots() ax.scatter(x, y) artists = [] for x0, y0, path in zip(x, y,paths): ab = AnnotationBbox(getImage(path), (x0, y0), frameon=False) artists.append(ax.add_artist(ab)) 

introduzca la descripción de la imagen aquí