1

我有一个 65,000 x 160 的矩阵,然后我使用 R 中的 image(X) 将其转换为图像。

我还使用选项 useRaster = TRUE,这使得绘图速度更快,文件也更小。

但是,文件大小仍然相当大〜 60 Mb。无论如何可以控制R中图像的文件大小?如果是这样,我很想听听如何以及通过限制文件大小会损失多少分辨率。

该文件创建为 pdf 文件,代码如下:

# ----- Define a function for plotting a matrix ----- #
myImagePlot <- function(x, filename, ...){
  dev = "pdf"
  #filename = '/home/dnaiel/test.pdf'
  if(dev == "pdf") { pdf(filename, version = "1.4") } else{}
     min <- min(x)
     max <- max(x)
     yLabels <- rownames(x)
     xLabels <- colnames(x)
     title <-c()
  # check for additional function arguments
  if( length(list(...)) ){
    Lst <- list(...)
    if( !is.null(Lst$zlim) ){
       min <- Lst$zlim[1]
       max <- Lst$zlim[2]
    }
    if( !is.null(Lst$yLabels) ){
       yLabels <- c(Lst$yLabels)
    }
    if( !is.null(Lst$xLabels) ){
       xLabels <- c(Lst$xLabels)
    }
    if( !is.null(Lst$title) ){
       title <- Lst$title
    }
  }
# check for null values
if( is.null(xLabels) ){
   xLabels <- c(1:ncol(x))
}
if( is.null(yLabels) ){
   yLabels <- c(1:nrow(x))
}

layout(matrix(data=c(1,2), nrow=1, ncol=2), widths=c(4,1), heights=c(1,1))

 # Red and green range from 0 to 1 while Blue ranges from 1 to 0
 ColorRamp <- rgb( seq(0,1,length=256),  # Red
                   seq(0,1,length=256),  # Green
                   seq(1,0,length=256))  # Blue
 ColorLevels <- seq(min, max, length=length(ColorRamp))

 # Reverse Y axis
 reverse <- nrow(x) : 1
 yLabels <- yLabels[reverse]
 x <- x[reverse,]

 # Data Map
 par(mar = c(3,5,2.5,2))
 image(1:length(xLabels), 1:length(yLabels), t(x), col=ColorRamp, xlab="",
 ylab="", axes=FALSE, zlim=c(min,max), useRaster=TRUE)
 if( !is.null(title) ){
    title(main=title)
 }
# Here we define the axis, left of the plot, clustering trees....
#axis(BELOW<-1, at=1:length(xLabels), labels=xLabels, cex.axis=0.7)
# axis(LEFT <-2, at=1:length(yLabels), labels=yLabels, las= HORIZONTAL<-1,
# cex.axis=0.7)

 # Color Scale (right side of the image plot)
 par(mar = c(3,2.5,2.5,2))
 image(1, ColorLevels,
      matrix(data=ColorLevels, ncol=length(ColorLevels),nrow=1),
      col=ColorRamp,
      xlab="",ylab="",
      xaxt="n", useRaster=TRUE)

 layout(1)
  if( dev == "pdf") {
    dev.off() }
}
# ----- END plot function ----- #

谢谢!

4

2 回答 2

5

当我创建这样的矩阵并imagejpeg调用中使用该设备的默认大小进行绘图时,我得到一个以 KB (90KB) 为单位的文件。

> bigm <-matrix(sample(1:8, 65000*160, repl=TRUE),  160, 65000)
> jpeg(filename="test.jpg")
> image(bigm)
> dev.off()
quartz 
     2 

这是否适合您的应用程序可能取决于此任务的确切性质和操作系统,两者都尚未指定。

于 2012-10-23T02:32:27.460 回答
1

当您将其保存为 pdf 格式时,您实际上是在为矩阵中每个绘制的正方形保存矢量对象。通过这样做,您可以获得“无限”分辨率,因为通过获得每个元素的向量信息,当您放大它时,实际上您重新绘制了被缩放字段覆盖的整个元素子集。把它想象成你以不同的格式保存整个矩阵。

当您将其保存在任何类型的位图(bmp、jpeg、png)中时,您实际上并没有保存每个元素的信息,每个像素都获得了一个统计值,该统计值代表了每个像素所覆盖的所有元素的信息。可以将其想象为您正在平均矩阵的值以适应特定的像素网格,该像素网格由输出设备的分辨率决定。

快速搜索“”矢量图像和位图之间的差异将使您更加清楚。

于 2014-08-25T16:15:12.283 回答