快速阅读png,添加网格& coords和输出

时间:2014-01-10 07:59:08

标签: r

我有很多平面图(映射)布局的png文件,我想:

  1. 读入R
  2. 添加网格线
  3. 在网格中添加每个单元格的坐标
  4. 输出
  5. 这些文件有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>

    enter image description here

1 个答案:

答案 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)

enter image description here