如何在 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 (“ Major”) ,我们得到

ggplot( rates.by.groups, aes(x=name, y=rate, colour=majr, group=majr) )

但是对于 f (“性别”) ,我们得到了

  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 )
101514 次浏览

注意: 此答案中的解决方案是“软不推荐”。请参阅下面使用 .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而不是 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 (裸 = 1,“引用”= 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)

另一个选项(ggplot2 > 3.0.0)是使用整洁的求值代词 .datarates.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)'))

Reprex 软件包于2019-04-04创作(0.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-使用自定义函数的错误条

做两件事

  1. 使用 sym()将列名转换为符号
  2. 当您要使用该符号时,请将 !!前缀到该符号

例子

my_col <- sym("Petal.Length")


iris %>%
ggplot(aes(x = Sepal.Length, y = !!my_col)) +
geom_point()