Маркировка графиков изображениями на графике в ggplot2
Итак, у меня есть R script, который может создавать график рассеяния с метками каждой точки. Sth вот так:
img1<-"http://blog.gettyimages.com/wp-content/uploads/2013/01/Siberian-Tiger-Running-Through-Snow-Tom-Brakefield-Getty-Images-200353826-001-628x419.jpg"
img2<-"http://blog.gettyimages.com/wp-content/uploads/2013/01/Hurricane-Sandy-Andrew-Burton-Getty-Images-154986556.jpg"
imgdata<-data.frame(c(img1,img2,img1,img2,img1,img2,img1,img2,img1,img2))
colnames(imgdata)<-"images"
txtdata<-data.frame(c("A","B","C","D","E","F","G","H","I","J"))
plotdata<-data.frame(seq(1:10),seq(11:20),txtdata,imgdata)
colnames(plotdata)<-c("var1","var2","texts","images")
ggplot(data=plotdata, aes(plotdata[,1],plotdata[,2])) +
geom_point(data=plotdata, aes(plotdata[,1],plotdata[,2])) +
geom_text(aes(label=plotdata$points,size=2, hjust=2))
Это дает график рассеяния, где каждая точка обозначается как "A", "B", "C"... и т.д.
То, что я хочу сделать, почти то же самое, кроме как вместо текстов, я хочу пометить каждую точку изображением, которое находится в ссылках вектора или фрейма данных (в данном случае в "imgdata" ). Обратите внимание, что я выбрал эти изображения так же, как примеры; У меня их гораздо больше, поэтому я не могу их вручную загрузить.
Ответы
Ответ 1
Вы можете использовать annotation_custom, но это будет очень много работы, потому что каждое изображение должно отображаться как растровый объект и его местоположение. Я сохранил изображения в виде png файлов, чтобы создать этот пример.
library(ggplot2)
library(png)
library(grid)
img1 <- readPNG("c:/test/img1.png")
g1<- rasterGrob(img1, interpolate=TRUE)
img2 <- readPNG("c:/test/img2.png")
g2<- rasterGrob(img2, interpolate=TRUE)
plotdata<-data.frame(seq(1:2),seq(11:12))
ggplot(data=plotdata) + scale_y_continuous(limits=c(0,4))+ scale_x_continuous(limits=c(0,4))+
geom_point(data=plotdata, aes(plotdata[,1],plotdata[,2])) +
annotation_custom(g1,xmin=1, xmax=1.5,ymin=1, ymax=1.5)+
annotation_custom(g2,xmin=2, xmax=2.5,ymin=2, ymax=2.5)
![enter image description here]()