循环遍历ggplot2中的数据帧

时间:2011-10-16 22:48:57

标签: r ggplot2

我想使用来自多个不同数据帧的ggplot制作一系列图表。我打算使用列表并按如下方式迭代列表:

libraries <- objects() #make a list of the dataframes we want to graph
for(i in libraries) {
  # create initial plots
  x1 <- qplot(data= i, V1, reorder(V2,V3), color = V3) + coord_flip()
  x2 <- ggplot(i, aes(x=reorder(V2,V3), group=V3, color=V3)) + geom_bar() 
  x3 <- ggplot(i, aes(x=V1, group=V3, color=V3)) + coord_flip() + geom_bar()
}

然而我收到错误消息:

Error: ggplot2 doesn't know how to deal with data of class factor

大概是因为'libraries'现在是一个字符变量而不是数据框。任何人都有关于如何遍历数据帧的另一个建议?我想我可以将它们与plyr合并,然后ggplot数据的一个子集,但这似乎增加了更多的工作。

2 个答案:

答案 0 :(得分:3)

迭代data.frames(只是定期组织的列表)的常用方法是使用lapply

 df1 <- data.frame(date = as.Date(10*365*rbeta(100, .5, .1)),group="a")
  df2 <- data.frame(date = as.Date(10*365*rbeta(50, .1, .5)),group="b")
  df3 <- data.frame(date = as.Date(10*365*rbeta(25, 3,3)),group="c")
  dfrmL <- list(df1,df2,df3)

 lapply(dfrmL, NROW)
[[1]]
[1] 100

[[2]]
[1] 50

[[3]]
[1] 25

在生成ggplot对象列表的情况下,我想Hadley方法将改为使用llply,但我不是一个熟练的plyr用户,所以让我完全建议未经测试的代码模板:

plts <- lapply(dfrmL, function(df) qplot(qplot(data= df, 
                                          V1, reorder(V2,V3), color = V3) + 
                                  coord_flip()
       )  
 # you may need to explicitly print() or plot() the plots as stated in the R-FAQ.    
lapply(plts, print)

答案 1 :(得分:3)

一个更完整,可重复的示例可能有助于我们建议更好的方法来实现这一目标,但至少我可以建议替换:

libraries <- objects()

用这个

libraries <- lapply(objects(), FUN = get)

实际上会构建当前环境中所有对象的列表。但我怀疑数据框是您环境中仅对象,因此您可能宁愿使用objectsls获取对象列表,请使用{{1 (或相关函数)根据其名称仅查找数据框,然后使用grep get仅查找这些数据框。

最后,您可以像@Dwin描述的那样迭代它们。