在 ggplot 中使用两个以编程方式定义的变量的线性运算作为美学
Using a linear operation of two programatically defined variables as an aesthetic in ggplot
我正在努力编写一个非常简单的包装器来为不同的变量生成图。假设我的数据是:
data <- tibble(year = seq(2001,2015),var1 = rnorm(15, mean=2), var1_sd = rnorm(15, mean=1, sd=0.8), var2 = rnorm(15, mean=7), var2_sd = rnorm(15, mean=1, sd=0.15))
而我想做的情节是
ggplot(data,aes(x=year, y=var1)) +
geom_pointrange(aes(ymin=var1-var1_sd, ymax=var1+var1_sd))
我想为多个变量组合制作完全相同的图,所以我写了一个包装器:
myplot <- function(data, var) {
var <- enquo(var)
sdvar <- paste0(quo_name(var), "_sd")
ggplot(data,aes(x=year, y=!!var)) +
geom_pointrange(aes(ymin=!!var-!!sdvar, ymax=!!var+!!sdvar))
}
当我调用 myplot(data, var1)
时,我收到错误 "Error in (~var1) - "var1_sd" : non-numeric argument to binary operator"
我认为问题出在不带引号的变量之间的线性运算上?有谁知道如何解决这个问题?
谢谢!!!
目前,sdvar
只是一个字符串。你可以用 sym()
把它变成一个符号,然后取消引用就可以了:
myplot <- function(data, var) {
var <- enquo(var)
sdvar <- sym(paste0(quo_name(var), "_sd"))
ggplot(data,aes(x=year, y=!!var)) +
geom_pointrange(aes(ymin=!!var-!!sdvar, ymax=!!var+!!sdvar))
}
按照@Marius 的建议转换为符号后,您还可以使用 curly-curly 运算符 ({{}}
)
library(ggplot2)
library(rlang)
myplot <- function(data, var) {
var <- enquo(var)
sdvar <- sym(paste0(quo_name(var), "_sd"))
ggplot(data,aes(x=year, y={{var}})) +
geom_pointrange(aes(ymin={{var}}-{{sdvar}}, ymax={{var}}+ {{sdvar}}))
}
myplot(data, var1)
我正在努力编写一个非常简单的包装器来为不同的变量生成图。假设我的数据是:
data <- tibble(year = seq(2001,2015),var1 = rnorm(15, mean=2), var1_sd = rnorm(15, mean=1, sd=0.8), var2 = rnorm(15, mean=7), var2_sd = rnorm(15, mean=1, sd=0.15))
而我想做的情节是
ggplot(data,aes(x=year, y=var1)) +
geom_pointrange(aes(ymin=var1-var1_sd, ymax=var1+var1_sd))
我想为多个变量组合制作完全相同的图,所以我写了一个包装器:
myplot <- function(data, var) {
var <- enquo(var)
sdvar <- paste0(quo_name(var), "_sd")
ggplot(data,aes(x=year, y=!!var)) +
geom_pointrange(aes(ymin=!!var-!!sdvar, ymax=!!var+!!sdvar))
}
当我调用 myplot(data, var1)
时,我收到错误 "Error in (~var1) - "var1_sd" : non-numeric argument to binary operator"
我认为问题出在不带引号的变量之间的线性运算上?有谁知道如何解决这个问题?
谢谢!!!
目前,sdvar
只是一个字符串。你可以用 sym()
把它变成一个符号,然后取消引用就可以了:
myplot <- function(data, var) {
var <- enquo(var)
sdvar <- sym(paste0(quo_name(var), "_sd"))
ggplot(data,aes(x=year, y=!!var)) +
geom_pointrange(aes(ymin=!!var-!!sdvar, ymax=!!var+!!sdvar))
}
按照@Marius 的建议转换为符号后,您还可以使用 curly-curly 运算符 ({{}}
)
library(ggplot2)
library(rlang)
myplot <- function(data, var) {
var <- enquo(var)
sdvar <- sym(paste0(quo_name(var), "_sd"))
ggplot(data,aes(x=year, y={{var}})) +
geom_pointrange(aes(ymin={{var}}-{{sdvar}}, ymax={{var}}+ {{sdvar}}))
}
myplot(data, var1)