如何将geom_raster()输出到光栅图像?

时间:2014-10-08 20:19:58

标签: r ggplot2

我正在进行定量图像分析,并使用ggplot2可视化结果。输出包含原始图像中每个像素的一个数据点。

geom_raster()很好地可视化我在R中的数据。但是输出对应于结果的光栅图像会很不错。这样,我可以使用轻量级图像查看器(例如feh)翻阅几个派生图像,像素将完美排列。

是否有一种简单的方法可以将像素和像素输出到图像文件?没有传说,没有轴,只有像素。假设我的data.frame包含rowcol的列,并且所需的输出分辨率也是已知的。

2 个答案:

答案 0 :(得分:3)

以这种方式:

library(ggplot2)
library(reshape2) # for melt(...)

n <- 100
set.seed(1)   # for reproducible example
img <- matrix(rnorm(n^2,30,3),nc=n)
gg <- melt(data.frame(x=1:n,img),id="x")
ggplot(gg) + geom_raster(aes(x=x,y=variable,fill=value))+
  scale_x_continuous(expand=c(0,0))+   # get rid of extra space on x-axis
  guides(fill=FALSE)+                  # turn off color legend
  theme(axis.text=element_blank(),     # turn off the axis annotations
        axis.ticks=element_blank(),
        axis.title=element_blank())

答案 1 :(得分:1)

感谢jlhoward指出我正确的方向。还有一些缺失的成分 - 例如,没有labs(x=NULL, y=NULL),输出PNG将在底部和左侧有白色边框。

我认为我的解决方案应该包含两个部分:

  1. 制作ggplot对象以显示我的数据。 (这一步与往常一样。)
  2. 调用通用函数来处理将该图输出为像素完美PNG所需的所有烦人细节。
  3. 这是一个这样的功能。

    BorderlessPlotPng <- function(plot, ...) {
      # Write a ggplot2 plot to an image file with no borders.
      #
      # Args:
      #   plot:  A ggplot2 plot object.
      #   ...:  Arguments passed to the png() function.
      require(grid)
      png(type='cairo', antialias=NULL, units='px', ...)
      print(plot
            + theme(plot.margin=unit(c(0, 0, -0.5, -0.5), 'line'),
                    axis.text=element_blank(),
                    axis.ticks=element_blank(),
                    axis.title=element_blank(),
                    legend.position='none')
            + scale_x_continuous(expand=c(0, 0))
            + scale_y_continuous(expand=c(0, 0))
            + labs(x=NULL, y=NULL)
            )
      dev.off()
    }
    

    为了看到它的实际效果,这里是一些合成数据的图表。 (为了演示目的,我将每个输出像素设置为10像素宽。)

    # Synthetic data.
    width <- 64
    height <- 48
    d <- data.frame(row=rep(1:height, each=width),
                    col=rep(1:width, height),
                    x=rnorm(n=width * height))
    
    # Construct and print the plot.
    library(ggplot2)
    plot <- (ggplot(data=d, aes(x=col, y=height + 1 - row, fill=x))
             + geom_raster()
             + scale_fill_gradient2()
             )
    pixel_size <- 10
    BorderlessPlotPng(plot,
                      filename='test.png',
                      width=width * pixel_size,
                      height=height * pixel_size)
    

    输出: One possible output from running the above code.

    当然,使用pixel_size <- 1运行会为您提供1:1的图像,您可以通过前后翻转将其与原始图像进行比较。