我有很多平面图(映射)布局的png文件,我想:
这些文件有1000个,所以我正在寻找一种快速的方法。什么是完成这项任务的快速方法。这些不需要是出版质量,因为我正在寻找单元格内的某些行为集群,并希望为100帧(png)中的每一帧记录协调的这些事件。
这是一个产生10个png文件的MWE:
x <- y <- seq(-4*pi, 4*pi, len = 27)
r <- sqrt(outer(x^2, y^2, "+"))
dir.create("delete_me")
wd <- getwd()
setwd("delete_me")
lapply(1:10, function(x){
png(sprintf("file_%s.png", x))
image(z = z <- cos(r^2)*exp(-r/x))
dev.off()
})
setwd(wd)
每个png的最终输出将如下所示(填入所有坐标)。
我认为grid
将是快速创建网格线的方法,但我不确定快速读取png还是绘制坐标(假设我们将在每个png上使用10 x 10网格)。 / p>
答案 0 :(得分:1)
如何使用ggplot()
和annotation_custom()
在整个绘图区域绘制图像,然后手动绘制网格线。
(在图像中,我事先从png文件中修剪了多余的空白和轴)
# pre-req libraries
require(ggplot2)
require(grid) # rasterGrob function
require(png) # to read the PNG file
width<-10
height<-10
# generate the points and labels for the grid
points<-data.frame(expand.grid(w=1:width,h=1:height))
points$labs<-paste0("(",points$w,",",points$h,")")
points$x<-points$w-0.5 # center
points$y<-points$h-0.5
# make the gridline co-ordinates
gridx<-data.frame(x=0:width,xend=0:width,y=rep(0,width+1),yend=rep(height,width+1))
gridy<-data.frame(x=rep(0,height+1),xend=rep(width,height+1),y=0:height,yend=0:height)
grids<-rbind(gridx,gridy)
# function to plot using ggplot with annotation_custom for the image
plotgrid<-function(file){
g<-ggplot(points)+theme_bw()+
annotation_custom(rasterGrob(readPNG(file),0,0,1,1,just=c("left","bottom")),0,width,0,height)+
geom_text(aes(x=x,y=y,label=labs))+
geom_segment(aes(x=x,xend=xend,y=y,yend=yend),data=grids) +
coord_cartesian(c(0,width),c(0,height))
return(g)
}
# run the function for each file in the folder
setwd("delete_me")
lapply(list.files(),function(x)plotgrid(x))
setwd(wd)