2011-10-04 43 views
4

我有這樣的項目,我想作出同樣的曲線,適用於各種不同的數據幀的載體的功能。我想我可以寫一個函數,它接受一個數據幀作爲輸入做到這一點,然後返回地塊的載體---這樣的事情:編寫返回GGPLOT2圖

df <- data.frame(x = runif(100), y = runif(100)) 
plot.list <- function(df){ 
    g1 <- qplot(x, y, data = df) 
    g2 <- qplot(x, x + y, data = df) 
    c(g1, g2) 
} 

而且我想這樣做:

print(plot.list(df)[1]) 

得到相同的結果,如果我做了:

print(qplot(x,y, data = df)) 

正如你所看到的,這也不行---它似乎打印出的數據幀,該地塊是基於上 (?)。我的猜測是,我誤解了一些非常基本的關於物體在R中的工作方式或ggplot2圖的性質。感謝您的任何建議(或者建議更好的方法來做我想做的事)。

回答

12

有幾種方法,你可以接近這樣的事情,但一招,你可能不知道的是,ggplot2具有特殊的運營商

d1 <- data.frame(x=1:10,y=rnorm(10)) 
d2 <- data.frame(x=20:29,y=runif(10)) 
p <- ggplot(data = d1, aes(x = x, y = y)) + geom_point() 
print(p) 
print(p %+% d2) 

所以%+%操作者將在數據幀d2插入由定義的情節結構:用於這種目的的,即,使用不同的數據幀創建相同的曲線圖。這樣,您可以創建一次繪圖,然後將其應用於不同的數據框。

爲了更直接地解決你在你的問題概括,一旦你創建的第一個情節使用,p,你可以lapply沿着數據幀列表這個情節結構:

d3 <- data.frame(x = 1:10, y = rexp(10)) 
rs <- lapply(list(d1,d2,d3),FUN = function(x,p){p %+% x},p=p) 

然後你有三個儲存在rs中的地塊。

+0

不錯。我們可以用不同的變量來做這個嗎? – MYaseen208

+0

@ MYaseen208我不這麼認爲。這將假定數據幀具有相同的結構(即具有相同名稱的相同變量)但可能具有不同的值。 – joran

8

存放在list而不是矢量對象:

plot.list <- function(df){ 
    g1 <- qplot(x, y, data = df) 
    g2 <- qplot(x, x + y, data = df) 
    list(g1, g2) 
} 
+0

這不應該有所作爲。但它顯然是。我想我應該爲ggplot對象定義一個'c'方法。 – hadley

+0

@Hadley - 它並沒有真正使多大意義,我。但我測試了它,似乎工作,讓我滾吧。 – Chase

+0

'c.ggplot = function(...)list(...)'? ;) – baptiste

4

下面是另一種方式來生成從共享同一列名不同的數據幀的多個曲線。

d1 = data.frame(x = 1:10, y = rexp(10)) 
d2 = data.frame(x = 5:20, y = rnorm(16)) 
d3 = data.frame(x = 21:30, y = rpois(10, 4)) 

plots = llply(list(d1, d2, d3), `%+%`, p = qplot(x, y))