2013-11-22 94 views
1

我正在研究一小段代碼,該代碼創建一個由多個獨立圖形組成的圖形,每個圖形顯示一個圖形,顯示縱向數據。對於視覺目的,我使用par將圖的數量限制爲每個圖20個,但數據集中有多於20個ID,因此我需要多個圖。如何在繪圖過程中打開新的繪圖窗口

當前問題:如何避免一旦代碼移動到第20(或N * 20)ID以上時,用新的繪圖覆蓋之前的繪圖。我認爲我需要使用plot.new(),但不清楚如何處理這個問題,並且找不到前一篇文章正好解決了這個問題。

我的代碼:

# Create sample data by sampling 
Start <- as.Date("2012-01-01") 
End <- as.Date("2013-01-01") 
data1 <- data.frame(ID = sort(rep(seq(64),3)), VisitDate = sort((Start + sample.int(End-Start, 192))), Count = rnorm(192, mean = 300, sd = 12), Treat = sample(0:1, 192, replace = TRUE)) 

# calculate days elapsed since start date, by ID 
data1$VisitDate <- with(data1,as.Date(VisitDate,format="%y-%b-%d")) 
data1$Days <- unlist(with(data1,tapply(VisitDate,ID,function(x){x-x[1]}))) 

#Define plot function 
plot_one <- function(d){ 
with(d, plot(Days, Count, t="n", tck=1, main=unique(d$ID), cex.main = 0.8, ylab = "", yaxt = 'n', xlab = "", xaxt="n", xlim=c(0,8), ylim=c(0,500))) # set limits 
    grid(lwd = 0.3, lty = 7) 
    with(d[d$Treat == 0,], points(Days, Count, col = 1)) 
    with(d[d$Treat == 1,], points(Days, Count, col = 2)) 
} 

#Create multiple plot figure 
par(mfrow=c(4,5), oma = c(0.5,0.5,0.5,0.5), mar = c(0.5,0.5,0.5,0.5)) 
plyr::d_ply(data1, "ID", plot_one) 

回答

1

如果您使用的是Windows,你叫windows()。如果您使用的是Mac,請致電quartz()。這些將打開一個新的設備,以便您的下一個電話(例如)plot()不會覆蓋您現有的地塊。

+0

感謝您的啓動。我的問題是「plyr :: d_ply(data1,」ID「,plot_one)」通過ID遍歷整個數據集,似乎沒有機會要求它停止並執行「plot()」 – marcel

+0

您可以致電數據集上的'plyr :: d_ply()'首先通過'ID'創建輸出,然後在20個批次上運行'plot_one()'? – gung