在循环中的 ggplot 中按名称引用列
Refering a column by its name in ggplot in a loop
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)
我有一个循环,我必须为其绘制 a
、b
和 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)
}
这个循环不起作用。我想知道如何通过 name.My 实际数据引用上述命令中的列
有很多变量,因此我是这样做的。
我们可以使用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
转换为'long'格式
library(tidyr)
library(dplyr)
gather(df, key, val, var.names) %>%
ggplot(., aes(x = val, fill = key)) +
geom_histogram() +
facet_wrap(~id)
-输出
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)
我有一个循环,我必须为其绘制 a
、b
和 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)
}
这个循环不起作用。我想知道如何通过 name.My 实际数据引用上述命令中的列 有很多变量,因此我是这样做的。
我们可以使用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
转换为'long'格式
library(tidyr)
library(dplyr)
gather(df, key, val, var.names) %>%
ggplot(., aes(x = val, fill = key)) +
geom_histogram() +
facet_wrap(~id)
-输出