2011-02-01 9 views
25

Tengo un conjunto de imágenes png de 150x150px, y un conjunto de coordenadas (x, y) a las que corresponden. ¿Hay alguna manera de trazar las imágenes en una cuadrícula? Por ejemplo, yo estoy buscando una solución de R o Python para crear algo como lo siguiente: enter image description hereColocar imágenes personalizadas en una ventana de trazado - como marcadores de datos personalizados o anotar esos marcadores

+0

Relacionados: http://stackoverflow.com/questions/11487797/python-matplotlib-basemap-overlay-small-image-on-map-plot –

Respuesta

27

se crea un cuadro delimitador creando instancias de AnnotationBbox -una vez para cada imagen que desea mostrar ; la imagen y sus coordenadas se pasan al constructor.

El código es obviamente repetitivo para las dos imágenes, por lo que una vez que el bloque se pone en una función, no es tan largo como parece aquí.

import matplotlib.pyplot as PLT 
from matplotlib.offsetbox import AnnotationBbox, OffsetImage 
from matplotlib._png import read_png 

fig = PLT.gcf() 
fig.clf() 
ax = PLT.subplot(111) 

# add a first image 
arr_hand = read_png('/path/to/this/image.png') 
imagebox = OffsetImage(arr_hand, zoom=.1) 
xy = [0.25, 0.45]    # coordinates to position this image 

ab = AnnotationBbox(imagebox, xy, 
    xybox=(30., -30.), 
    xycoords='data', 
    boxcoords="offset points")         
ax.add_artist(ab) 

# add second image 
arr_vic = read_png('/path/to/this/image2.png') 
imagebox = OffsetImage(arr_vic, zoom=.1) 
xy = [.6, .3]     # coordinates to position 2nd image 

ab = AnnotationBbox(imagebox, xy, 
    xybox=(30, -30), 
    xycoords='data', 
    boxcoords="offset points") 
ax.add_artist(ab) 

# rest is just standard matplotlib boilerplate 
ax.grid(True) 
PLT.draw() 
PLT.show() 

enter image description here

+0

Esto es genial, ¿sabes cómo eliminar el borde? –

+0

@JohnM Pass 'frameon = False' a' AnnotationBbox() ' – bdforbes

3

me gustaría utilizar matplotlib para eso. this demo muestra algo similar, estoy seguro de que se puede adaptar a su problema particular

17

Una forma de hacerlo en R (2.11.0 y superior):??

library("png") 
# read a sample file (R logo) 
img <- readPNG(system.file("img", "Rlogo.png", package="png")) 
# img2 <- readPNG(system.file("img", "Rlogo.png", package="png")) 
img2 <- readPNG("hand.png", TRUE) # here import a different image 
if (exists("rasterImage")) { 
    plot(1:1000, type='n') 
    rasterImage(img, 100, 100, 200, 200) 
    rasterImage(img2, 300, 300, 400, 400) 
} 

ver readPNG y rasterImage de detalles. enter image description here

1

En R, leido en la ayuda (rasterImage):

require(grDevices) 
#set up the plot region: 
op <- par(bg = "thistle") <h> 
plot(c(100, 250), c(300, 450), type = "n", xlab="", ylab="") 
image <- as.raster(matrix(0:1, ncol=5, nrow=3)) 
rasterImage(image, 100, 300, 150, 350, interpolate=FALSE) 
rasterImage(image, 100, 400, 150, 450) 
rasterImage(image, 200, 300, 200 + xinch(.5), 300 + yinch(.3), interpolate=FALSE) 
rasterImage(image, 200, 400, 250, 450, angle=15, interpolate=FALSE) 
par(op) 

.... es un buen ejemplo.

3

También en R puede usar las funciones my.symbols y ms.image en el paquete TeachingDemos.

Cuestiones relacionadas