为什么包含参数的 'if' 语句在 ggplot geom 中不起作用?
Why do 'if' statements including arguments don't work in ggplot geoms?
为什么以下方法不起作用?
ggplot(mtcars,aes(x=wt,y=mpg)) +
geom_smooth({if (T) ("colour='red'")})
ggplot(mtcars,aes(x=wt,y=mpg)) +
geom_smooth(ifelse(T,("colour='red'")))
ggplot(mtcars,aes(x=wt,y=mpg)) +
geom_smooth(switch(T,("colour='red'")))
他们都这样输出:
Error: `mapping` must be created by `aes()`
有什么解决方法?
编辑:
建议的答案建议将 if
语句放在命名的 colour
参数之后。问题是,即使我保留 color=NA
或 NULL
或空白,如果 aes(colour)
已经定义,它也会发生冲突,因此它不等同于根本没有参数。 这确实是我想要达到的 problem/workaround。 例如:
ggplot(mtcars,aes(x=wt,y=mpg,colour=factor(cyl))) + geom_smooth(colour = NA)
不会产生三个彩色线条(如果 aes()
会接管,它应该会接管,表明它正在被覆盖)
设置 geom_smooth(color = NULL)
给出:Error: Aesthetics must be either length 1 or the same as the data (80): colour
设置 geom_smooth(color = )
给出:Error in geom_smooth(color = ) : argument is missing, with no default
注意:Gregory 还建议复制 geom 语句, 是 一个可行的解决方法,但我的问题最终是关于 'is there a way to avoid doing precisely this'(复制调用 geoms_
) 并试图理解 为什么 我们不允许使用包含参数的 if
语句。
编辑 2:
我提出这个问题的初衷是关于 为什么 ggplot2 的编码方式不允许条件语句在 geom 中包含完整的可选参数(例如,在某些情况下会发生冲突或产生错误吗?)。 Yifu Yan 最初对这个问题提出了一个有希望的答案,他说“颜色是一个命名参数,它必须有一个名字”,尽管我会更欣赏 elaboration/explanation
我目前的理解是,如果不重复调用 geom,可能无法做我想做的事。但是,我一直在寻找的函数示例(不重复调用 geoms)是:
scatterfun <- function (Data,Predictor,Response,has.Groups,Group.variable) {
ggplot(Data,aes(x={{Predictor}},y={{Response}})) +
geom_smooth(switch(has.Groups + 1,("colour='red'"),
aes(colour={{Group.variable}})))
}
在 has.Groups = TRUE
时有效
scatterfun(mtcars,wt,mpg,T,factor(cyl))
(如您所见,我想保留置信区间)
但在 has.Groups = FALSE
:
时不起作用
scatterfun(mtcars,wt,mpg,F,factor(cyl))
Error: `mapping` must be created by `aes()`
因此,对于这个问题,当我想有条件地向 geom 语句添加单色时,我试图更好地理解该部分(这就是为什么我在问题的开头将这部分分开)。希望现在更清楚了。
场景 1
如果您想要三行或一行:
condition <- TRUE
ggplot(mtcars,aes(x=wt,y=mpg,colour=factor(cyl))) +
{
if ( condition ){
geom_smooth()
} else {
geom_smooth(color = "black")
}
}
condition <- FALSE
ggplot(mtcars,aes(x=wt,y=mpg,colour=factor(cyl))) +
{
if ( condition ){
geom_smooth()
} else {
geom_smooth(color = "black")
}
}
场景 2
需要说明的是,您始终需要为每个组设置三个单独的回归线。但是,与此同时,您还想为数据创建一条条件回归线,而不考虑组。
condition <- TRUE
ggplot(mtcars,aes(x=wt,y=mpg,colour=factor(cyl))) +
geom_smooth(se = FALSE) +
geom_smooth(colour = if (condition) "black" else NA,se = FALSE)
library(ggplot2)
condition <- FALSE
ggplot(mtcars,aes(x=wt,y=mpg,colour=factor(cyl))) +
geom_smooth(se = FALSE) +
geom_smooth(colour = if (condition) "black" else NA,se = FALSE)
您可以创建一个独立函数,有条件地添加红色平滑或默认平滑。
library(ggplot2)
smooth_condition <- function (x) {
return(
if (x) {
geom_smooth(color = 'red')
} else {
geom_smooth()
}
)
}
ggplot(mtcars, aes(x = wt, y = mpg)) +
smooth_condition(TRUE)
ggplot(mtcars, aes(x = wt, y = mpg)) +
smooth_condition(FALSE)
为什么以下方法不起作用?
ggplot(mtcars,aes(x=wt,y=mpg)) +
geom_smooth({if (T) ("colour='red'")})
ggplot(mtcars,aes(x=wt,y=mpg)) +
geom_smooth(ifelse(T,("colour='red'")))
ggplot(mtcars,aes(x=wt,y=mpg)) +
geom_smooth(switch(T,("colour='red'")))
他们都这样输出:
Error: `mapping` must be created by `aes()`
有什么解决方法?
编辑:
建议的答案建议将 if
语句放在命名的 colour
参数之后。问题是,即使我保留 color=NA
或 NULL
或空白,如果 aes(colour)
已经定义,它也会发生冲突,因此它不等同于根本没有参数。 这确实是我想要达到的 problem/workaround。 例如:
ggplot(mtcars,aes(x=wt,y=mpg,colour=factor(cyl))) + geom_smooth(colour = NA)
不会产生三个彩色线条(如果 aes()
会接管,它应该会接管,表明它正在被覆盖)
设置 geom_smooth(color = NULL)
给出:Error: Aesthetics must be either length 1 or the same as the data (80): colour
设置 geom_smooth(color = )
给出:Error in geom_smooth(color = ) : argument is missing, with no default
注意:Gregory 还建议复制 geom 语句, 是 一个可行的解决方法,但我的问题最终是关于 'is there a way to avoid doing precisely this'(复制调用 geoms_
) 并试图理解 为什么 我们不允许使用包含参数的 if
语句。
编辑 2:
我提出这个问题的初衷是关于 为什么 ggplot2 的编码方式不允许条件语句在 geom 中包含完整的可选参数(例如,在某些情况下会发生冲突或产生错误吗?)。 Yifu Yan 最初对这个问题提出了一个有希望的答案,他说“颜色是一个命名参数,它必须有一个名字”,尽管我会更欣赏 elaboration/explanation
我目前的理解是,如果不重复调用 geom,可能无法做我想做的事。但是,我一直在寻找的函数示例(不重复调用 geoms)是:
scatterfun <- function (Data,Predictor,Response,has.Groups,Group.variable) {
ggplot(Data,aes(x={{Predictor}},y={{Response}})) +
geom_smooth(switch(has.Groups + 1,("colour='red'"),
aes(colour={{Group.variable}})))
}
在 has.Groups = TRUE
scatterfun(mtcars,wt,mpg,T,factor(cyl))
(如您所见,我想保留置信区间)
但在 has.Groups = FALSE
:
scatterfun(mtcars,wt,mpg,F,factor(cyl))
Error: `mapping` must be created by `aes()`
因此,对于这个问题,当我想有条件地向 geom 语句添加单色时,我试图更好地理解该部分(这就是为什么我在问题的开头将这部分分开)。希望现在更清楚了。
场景 1
如果您想要三行或一行:
condition <- TRUE
ggplot(mtcars,aes(x=wt,y=mpg,colour=factor(cyl))) +
{
if ( condition ){
geom_smooth()
} else {
geom_smooth(color = "black")
}
}
condition <- FALSE
ggplot(mtcars,aes(x=wt,y=mpg,colour=factor(cyl))) +
{
if ( condition ){
geom_smooth()
} else {
geom_smooth(color = "black")
}
}
场景 2
需要说明的是,您始终需要为每个组设置三个单独的回归线。但是,与此同时,您还想为数据创建一条条件回归线,而不考虑组。
condition <- TRUE
ggplot(mtcars,aes(x=wt,y=mpg,colour=factor(cyl))) +
geom_smooth(se = FALSE) +
geom_smooth(colour = if (condition) "black" else NA,se = FALSE)
library(ggplot2)
condition <- FALSE
ggplot(mtcars,aes(x=wt,y=mpg,colour=factor(cyl))) +
geom_smooth(se = FALSE) +
geom_smooth(colour = if (condition) "black" else NA,se = FALSE)
您可以创建一个独立函数,有条件地添加红色平滑或默认平滑。
library(ggplot2)
smooth_condition <- function (x) {
return(
if (x) {
geom_smooth(color = 'red')
} else {
geom_smooth()
}
)
}
ggplot(mtcars, aes(x = wt, y = mpg)) +
smooth_condition(TRUE)
ggplot(mtcars, aes(x = wt, y = mpg)) +
smooth_condition(FALSE)