对于R中的多个ggplots的循环

时间:2014-07-24 19:44:48

标签: r ggplot2

我有这个

Product <- c("X","Y","Z")
Var1 <- runif(3)
Var2 <- rnorm(3)
Var3 <- rnorm(3)

df <- data.frame(Product,Var1,Var3,Var2)

bar.plot <- function(dat,k,p,this) {
  mytitle <- paste("Topic:",as.character(this))
  ggplot(dat, aes_string(x = substitute(k), y = substitute(p))) +
    geom_bar(position = "dodge",stat = "identity",fill="lightblue", colour="black") +
    theme(plot.title=element_text(size=25,face="bold"), axis.text.y =   element_text(size=20),axis.title.y = element_blank(),axis.text.x = element_text(size = 10,angle = 30, hjust = 1)) +
    labs(title=mytitle)
}

我希望以下内容为df中的每个列返回三个图。但事实并非如此。

col <- c(Var1,Var2,Var3)
for(i in col){
bar.plot(df,Product,i,"Data")
}

为什么会出现这种情况?感谢。

2 个答案:

答案 0 :(得分:0)

正如@DrDom所说,你需要col中的字符,如果你想在for循环中看到你需要print它们的情节。 (或保存它们,或将它们分配到list ...)

col <- c("Var1", "Var2", "Var3")
for(i in col){
    print(bar.plot(df, Product, i, "Data"))
}

虽然这可以与原始bar.plot一起使用,substitute完全没必要(您已经在使用aes_string!),因此我们可以简化为:

bar.plot <- function(dat,k,p,this) {
    mytitle <- paste("Topic:", as.character(this))
    ggplot(dat, aes_string(x = k, y = p)) +
        geom_bar(position = "dodge", stat = "identity",
                 fill = "lightblue", colour = "black") +
        theme(plot.title=element_text(size = 25, face = "bold"),
              axis.text.y = element_text(size = 20),
              axis.title.y = element_blank(),
              axis.text.x = element_text(size = 10, angle = 30, hjust = 1)) +
        labs(title = mytitle)
}

答案 1 :(得分:0)

这是一种略有不同的方法。

bar.plot <- function(dat,k,p,this) {
  mytitle <- paste("Topic:",as.character(this))
  gg      <- data.frame(x=dat[,k],y=dat[,p])
  ggplot(gg, aes(x,y)) +
    geom_bar(position = "dodge",stat = "identity",fill="lightblue", colour="black") +
    theme(plot.title=element_text(size=25,face="bold"), axis.text.y =   element_text(size=20),axis.title.y = element_blank(),axis.text.x = element_text(size = 10,angle = 30, hjust = 1)) +
    labs(title=mytitle)
}
for(i in 2:4){
  print(bar.plot(df,"Product",i,"Data"))
}

这会在函数内部构建一个包含xy列的数据框,并在调用ggplot(...)时使用该数据框,而不是尝试使用aes_string(...)。< / p>

您的代码:col <- c(Var1,Var2,Var3)创建一个矢量长度9,基本上连接三个Var列。当你使用for (i in col) R将i设置为col中每个元素的值时,循环运行9次 - 而不是你想要的。