2014-09-05 28 views
0

我正在繪製一個循環中的R中的大量數據,並使用png()將圖導出爲300dpi分辨率的png。利用我所有的數據,我最終創建了大約2000個地塊。這需要大約15分鐘的時間來執行。當使用postscript()導出到postscript時,大約需要20秒來處理整個數據。生成的.png的近似文件大小約爲300KB,對於.ps大約爲5KBR:一種更快捷的方式將圖輸出爲具有大量數據的.png。

有人知道更快的PNG導出方法嗎?謝謝你的建議。

# Plot NAME and ID as filename 
for(i in 1:length(ind)){ 
    png(names(ind[i]), width=3358, height=2329, res=300) 
    # if postscript; uncomment following line 
    # postscript(names(ind[i])) 
    par(mar=c(6,8,6,5)) 
    plot(ind[[i]][,c('YEAR','VALUE')], 
     type='b', 
     main=ind[[i]][1,'NAME'], 
     xlab="Time [Years]", 
     ylab="Value [mm]") 

    dev.off() 
} 
+0

除了得到一個更快的機器,或使用'parallel'包分配負載,關於你唯一的選擇是降低分辨率。 – 2014-09-05 12:09:49

+0

降低分辨率和獲得更快的機器是明確的'解決方案',我想問問有沒有人可能知道使用這些設置的更快的導出方法(分辨率和尺寸是預先確定的),因爲我沒有找到任何東西。將看看並行包,謝謝。 – kurdtc 2014-09-05 12:18:08

+0

Postscript創建較小的文件,速度更快,因爲它可以創建矢量圖形而不是位圖圖形。查看代碼很有可能*您應該創建矢量圖形。 – Roland 2014-09-05 12:31:35

回答

2

因此,一個reproduicible例子是:

dir.create("DummyPlots") 
setwd("DummyPlots") 

system.time(for(i in 1:500) 
    { png(paste0("Image", i, ".png")) ; plot(i) ; dev.off() }) 
# 7.5 s 

這裏有一個方法,這是一個快一點:

system.time( {png("FastImage%03d.png") 
for(i in 1:500) 
plot(i) 
dev.off() }) 
# 5.2 s 

setwd("..") 
unlink("DummyPlots", recursive=TRUE) 
+0

這沒有意義:你只是將分辨率降低到72.雖然我同意72dpi更明智,但它不是OP所呈現的。 – 2014-09-05 13:22:29

+0

您仍然可以指定分辨率!兩個代碼塊之間的區別是調用png 2000次,或者只是一次。我可以爲更復雜/更大的圖像形象,你甚至可以節省更多的時間... – 2014-09-05 13:25:18

+1

我看到了年點,並承認我認爲主要timewaster產生每個圖像。 Howsabout你運行一個時間試驗,看看瓶頸在哪裏? – 2014-09-05 13:29:16

相關問題