2012-10-22 142 views
1

我有65000 160矩陣,即我然後使用圖像(X)中R.圖像繪圖太大

變換成圖像

我也使用選項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 ----- # 

謝謝!

+1

使用位圖格式繪圖(最好是??png)? (雖然我不確定這是否會對這種情況有所幫助:'?jpeg'實際上可能會更好)您打算如何傳播此圖 - 即您希望讀者看到哪些細節?是否有非常大的特徵? –

+0

這個問題需要如何創建文件的細節 – mdsumner

+0

@BenBolker謝謝。你是對的,我試圖把它保存爲pdf,這可能是大量空間使用的來源。 jpg和png也適合我。我仍然很想知道如何限制pdf格式的大小。 – Dnaiel

回答

5

當我在jpeg調用中使用image創建這樣的矩陣和圖時,使用該設備的默認大小調用時,我得到一個以KB爲單位的文件(90KB)。

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

這是否適合您的應用程序可能取決於此任務和操作系統的確切性質,這兩者都尚未指定。

+0

我使用PDF格式,但JPG也不錯。現在看起來要低得多了。不知道爲什麼當它創建是因爲pdf是如此之大。我仍然很好奇如何限制pdf格式的文件大小。再次感謝。 – Dnaiel

+2

我已經有R創建的pdf,這也是巨大的。壓縮時,「jpeg」或「png」設備似乎更好。對pdf的期望是,它們在擴展時不會失去分辨率,而其他設備在大小更細的情況下,其尺寸更經濟。 –

1

當您以pdf格式保存它時,實際上是爲矩陣中每個繪製的方形保存矢量對象。通過這樣做,您可以通過獲取每個元素的矢量信息來獲得「無限制」分辨率,當您放大時,您實際上會重新繪製由縮放字段覆蓋的整個元素子集。想想它,就好像你在用不同的格式保存整個矩陣。

將其保存在任何類型的位圖(bmp,jpeg,png)中時,實際上並未保存每個元素的信息,每個像素都會得到一個統計值,該值表示每個像素覆蓋的所有元素的信息。可以將它看作是將您的矩陣的值取平均值,以便適合由輸出設備的分辨率決定的特定像素網格。

快速搜索矢量圖像和位圖之間的差異將使您對所有事情更清晰。