代码之家  ›  专栏  ›  技术社区  ›  89_Simple

在循环的ggplot中按名称引用列[重复]

  •  1
  • 89_Simple  · 技术社区  · 6 年前
    df <- data.frame(id = rep(1:6, each = 50), a = rnorm(50*6, mean = 10, sd = 5), 
                 b = rnorm(50*6, mean = 20, sd = 10), 
                 c = rnorm(50*6, mean = 30, sd = 15))
    

    我有三个变量 a , b c . 如果我要为所有人绘制一个变量 loc.id

    ggplot(df, aes(a)) + geom_histogram() + facet_wrap(~id)
    

    我有一个循环,我必须为它设计 , C .

    var.names <- c("a","b","c")
    
    for(v in seq_along(var.names)){
    
          variable <- var.names[v]
    
         ggplot(df, aes(x = paste0(variable))) + geom_histogram() + facet_wrap(~id)
    }
    

    这个循环不起作用。我想知道如何通过名称引用上面命令中的列。 有很多变量,所以我是这样做的。

    1 回复  |  直到 6 年前
        1
  •  1
  •   akrun    6 年前

    我们可以使用 aes_string 传递字符串

    l1 <- vector("list", length(var.names))
    for(v in seq_along(var.names)){
          variable <- var.names[v]
          l1[[v]] <- ggplot(df, aes_string(x = variable)) + 
                      geom_histogram() +
                      facet_wrap(~id)
     }
    

    或者开发版本中的另一个选项应该是将字符串转换为符号( rlang::sym )并评估( !! ) aes

    for(v in seq_along(var.names)){
          variable <- rlang::sym(var.names[v])
          l1[[v]] <- ggplot(df, aes(x = !!variable)) +
                       geom_histogram() +
                        facet_wrap(~id)
     }
    

    存储在 list 可以保存在 .pdf 文件

    library(gridExtra)
    l2 <- map(l1, ggplotGrob)
    ggsave(marrangeGrob(grobs = l2, nrow = 1, ncol = 1), file = 'plots.pdf')
    

    如果我们需要在一页中覆盖这三个图,请使用 gather 转换为“长”格式

    library(tidyr)
    library(dplyr)
    gather(df, key, val, var.names) %>% 
        ggplot(., aes(x = val, fill = key)) +
        geom_histogram() + 
        facet_wrap(~id)
    

    -输出

    enter image description here