我有这个项目,我想为各种不同的数据框制作相同的图.我想我可以通过编写一个将数据框作为输入然后返回图形矢量的函数来做到这一点 - 就像这样:
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)
}
Run Code Online (Sandbox Code Playgroud)
我想这样做:
print(plot.list(df)[1])
Run Code Online (Sandbox Code Playgroud)
获得与我完成相同的结果:
print(qplot(x,y, data = df))
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,这不起作用 - 它似乎打印出情节所基于的数据框(?).我的猜测是,我误解了关于对象在R中的工作原理或者ggplot2图的性质.感谢您的任何建议(或者建议我采取更好的方法来做我想做的事情).
jor*_*ran 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)
Run Code Online (Sandbox Code Playgroud)
因此,%+%操作员将数据框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)
Run Code Online (Sandbox Code Playgroud)
然后你有三个图存储rs.
将对象存储在一个list而不是向量中:
plot.list <- function(df){
g1 <- qplot(x, y, data = df)
g2 <- qplot(x, x + y, data = df)
list(g1, g2)
}
Run Code Online (Sandbox Code Playgroud)