Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

like image 532
grautur Avatar asked Feb 01 '11 08:02

grautur


3 Answers

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

like image 134
doug Avatar answered Oct 01 '22 18:10

doug


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

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

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

like image 32
Paolo Avatar answered Oct 01 '22 18:10

Paolo


I would use matplotlib for that. this demo shows something similar, I am sure it can be adapted to your particular problem

like image 34
rymurr Avatar answered Oct 01 '22 18:10

rymurr