Placing Custom Images in a Plot Window--as custom data markers or to annotate those markers


I have a set of 150x150px png images, and a set of (x, y) coordinates that they correspond to. Is there a way to plot the images on a grid? For example, I'm looking for an R or Python solution to create something like the following: enter image description here

4/21/2012 12:46:44 AM

Accepted Answer

You create a bounding box by instantiating AnnotationBbox--once for each image that you wish to display; the image and its coordinates are passed to the constructor.

The code is obviously repetitive for the two images, so once that block is put in a function, it's not as long as it seems here.

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

fig = PLT.gcf()
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.),
    boxcoords="offset points")                                  

# 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),
    boxcoords="offset points")

# rest is just standard matplotlib boilerplate

enter image description here

4/10/2012 2:52:34 AM

One way to do it in R (2.11.0 and higher):

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

see ?readPNG and ?rasterImage for details. enter image description here

Licensed under: CC-BY-SA with attribution
Not affiliated with: Stack Overflow