首页 > 解决方案 > 在循环中在 ggplot 中按名称引用列

问题描述

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和。如果我必须为所有人绘制一个变量bcloc.id

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

我有一个循环,我必须为其绘制a,bc.

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)
}

这个循环不起作用。我想知道如何通过名称引用上述命令中的列。我的实际数据有很多变量,因此我就是这样做的。

标签: rggplot2facet-wrap

解决方案


我们可以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)

-输出

在此处输入图像描述


推荐阅读