在循环中通过 ggplot 中的名称引用列

标签 r ggplot2 facet-wrap

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 , bc 。如果我必须为所有 loc.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)
}

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

最佳答案

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

存储在列表中的绘图可以保存在.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

关于在循环中通过 ggplot 中的名称引用列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50722654/

相关文章:

css - 如何为 R 中的数据框/表中的特定单元格着色?

r - 无法使用常规代码增加 x 轴刻度

根据因子级别重新格式化标签/保留 ggplot2::facet_wrap() 中多因子构面的顺序

R将传统情节和ggplot2放在一起

R解析字符串中括号之间的数字串

r - 使用 nlme::lme 将代码转换为 lme4::lmer

r - 使用 fill 参数保持 geom_bar 中变量的顺序相同

python - 在 Python 中使用 Rpy2 对齐 ggplot2 中不同的非小平面图

r - 将facet_wrap分割成多页PDF

r - 如何在我的一个方面标签中使用希腊符号?