我有这个项目,我想为各种不同的数据框制作相同的图。我想我可以通过编写一个将数据框作为输入然后返回图形矢量的函数来做到这一点 - 就像这样:
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图的性质。感谢您的任何建议(或者建议我采取更好的方法来做我想做的事情)。
答案 0 :(得分:13)
有几种方法可以处理这类事情,但您可能不知道的一个技巧是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
定义的绘图结构中。这样,您可以创建一次绘图,然后将其应用于不同的数据框。
为了更直接地解决您在问题中概述的用法,一旦创建了第一个图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
然后你在{{1}}中存储了三个图。
答案 1 :(得分:8)
将对象存储在list
而不是向量中:
plot.list <- function(df){
g1 <- qplot(x, y, data = df)
g2 <- qplot(x, x + y, data = df)
list(g1, g2)
}
答案 2 :(得分: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))