提问人:Theodore Norvell 提问时间:3/11/2014 最后编辑:Gregor ThomasTheodore Norvell 更新时间:10/18/2022 访问量:118377
如何在ggplot中使用变量指定列名
How to use a variable to specify column name in ggplot
问:
我有一个ggplot命令
ggplot( rates.by.groups, aes(x=name, y=rate, colour=majr, group=majr) )
在函数中。但是我希望能够使用函数的参数来挑选要用作颜色和组的列。即我想要这样的东西
f <- function( column ) {
...
ggplot( rates.by.groups, aes(x=name, y=rate, colour= ??? , group=??? ) )
}
因此,ggplot 中使用的列由参数确定。例如,对于 f(“majr”),我们得到
ggplot( rates.by.groups, aes(x=name, y=rate, colour=majr, group=majr) )
但是对于 f(“gender”),我们得到的结果是
ggplot( rates.by.groups, aes(x=name, y=rate, colour=gender, group=gender) )
我尝试过的一些事情:
ggplot( rates.by.groups, aes(x=name, y=rate, colour= columnName , group=columnName ) )
没有用。也没有
e <- environment()
ggplot( rates.by.groups, aes(x=name, y=rate, colour= columnName , group=columnName ), environment=e )
答:
注意:此答案中的解决方案是“软弃用”。请参阅下面使用 .data[[
获取当前首选方法的答案。
您可以使用:aes_string
f <- function( column ) {
...
ggplot( rates.by.groups, aes_string(x="name", y="rate", colour= column,
group=column ) )
}
只要将列作为字符串(而不是 )传递给函数。另请注意,我们将其他列 和 更改为字符串。f("majr")
f(majr)
"name"
"rate"
如果出于某种原因您不想使用 ,您可以将其更改为(稍微麻烦一些):aes_string
ggplot( rates.by.groups, aes(x=name, y=rate, colour= get(column),
group=get(column) ) )
评论
aes_string(x = rates.by.groups$name...
ggplot(data = rates.by.groups...
)
"column_name"
"column"
尝试使用代替 .aes_string
aes
评论
从发行说明:ggplot2 V3.0.0
aes() 现在支持准报价,因此您可以使用 !, !!!, 和 :=.这取代了现在的 aes_() 和 aes_string() 软弃用(但将保留很长时间)。
现在的惯用方法是将变量包含的字符串转换为符号,使用(与基本别名 / 几乎相同),然后使用sym()
as.name()
as.symbol()
!!
模拟OP的数据,我们可以做到:
library(tidyverse)
rates.by.groups <- data.frame(
name = LETTERS[1:3],
rate = 1:3,
mjr = LETTERS[c(4,4,5)],
gender = c("M","F","F")
)
f <- function(column) {
column <- sym(column)
ggplot(rates.by.groups,
aes(x = name,
y = rate,
fill = !!column,
group = !!column)) +
geom_col()
}
f("gender")
f("mjr")
x <- "gender"
f(x)
如果我们更愿意将原始名称提供给函数,我们可以这样做:
f2 <- function(column) {
column <- ensym(column)
ggplot(rates.by.groups,
aes(x = name,
y = rate,
fill = !!column,
group = !!column)) +
geom_col()
}
它将与名称(又名符号)和字符串文字一起使用
f2(gender)
f2(mjr)
f2("gender")
f2("mjr")
正如莱昂内尔所说:ensym()
它旨在模仿参数的语法,您可以在其中同时提供两者 在 LHS 中,例如 list(bare = 1, “quoted” = 2)
关于enquo()
enquo()
引用输入参数的表达式(不一定是符号),它不会像那样将字符串文字转换为符号,因此在这里可能不太适应,但我们可以这样做:ensym()
f3 <- function(column) {
column <- enquo(column)
ggplot(rates.by.groups,
aes(x = name,
y = rate,
fill = !!column,
group = !!column)) +
geom_col()
}
f3(gender)
f2(mjr)
评论
aes()
enquo()
ensym()
f2
aname <- "mjr"; f2(aname)
dplyr
rates.by.groups %>% group_by(!!column)...
f2
ensym
select
group_by
select
group_by
facet_grid
facet_grid(cols = vars(!!column))
facet_grid(~ !!column)
另一个选项 () 是使用整洁的评估代词 .data
从数据框中切取所选变量/列。ggplot2 > 3.0.0
rates.by.groups
另请参阅此答案
library(ggplot2)
theme_set(theme_classic(base_size = 14))
# created by @Moody_Mudskipper
rates.by.groups <- data.frame(
name = LETTERS[1:3],
rate = 1:3,
mjr = LETTERS[c(4, 4, 5)],
gender = c("M", "F", "F")
)
f1 <- function(df, column) {
gg <- ggplot(df,
aes(x = name,
y = rate,
fill = .data[[column]],
group = .data[[column]])) +
geom_col() +
labs(fill = column)
return(gg)
}
plot_list <- lapply(list("gender", "mjr"), function(x){ f1(rates.by.groups, x) })
plot_list
#> [[1]]
#>
#> [[2]]
# combine all plots
library(egg)
ggarrange(plots = plot_list,
nrow = 2,
labels = c('A)', 'B)'))
创建于 2019-04-04 由 reprex 软件包 (v0.2.1.9000)
评论
使用确实解决了这个问题,但在添加错误栏时确实遇到了一个问题。下面是一个简单的解决方案。aes_string
geom_errorbar
#Identify your variables using the names of your columns indie your dataset
xaxis <- "Independent"
yaxis <- "Dependent"
sd <- "error"
#Specify error bar range (in 'a-b' not 'a'-'b')
range <- c(yaxis, sd) #using c(X, y) allows use of quotation marks inside formula
yerrbar <- aes_string(ymin=paste(range, collapse='-'),
ymax=paste(range, collapse='+'))
#Build the plot
ggplot(data=Dataset, aes_string(x=xaxis, y=yaxis)) +
geom_errorbar(mapping=yerrbar, width=15, colour="#73777a", size = 0.5) +
geom_point (shape=21)
奖励,您还可以在 ggplot 中使用以下行向绘图添加分面:
facet_grid(formula(paste(Variable1, "~", Variable2)))
此脚本是从以下原始帖子修改而来的: ggplot2 - 使用自定义函数的误差线
做两件事
- 将列名转换为符号
sym()
- 在要使用符号时在符号前面添加
!!
例
my_col <- sym("Petal.Length")
iris %>%
ggplot(aes(x = Sepal.Length, y = !!my_col)) +
geom_point()
上一个:如何在R中生成对象的排列或组合?
评论