为什么包含参数的'if'语句在ggplot geoms中不起作用?

时间:2019-09-10 23:05:28

标签: r ggplot2 colors aesthetics

为什么下面的方法不起作用?

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=NANULL留空,如果已经定义了aes(colour),它也会发生冲突,因此它并不等同于完全没有自变量。 这确实是我要解决的问题/解决方法。例如:

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语句,这是一个可行的解决方法,但我的问题最终是关于“是否有一种方法可以避免执行此操作”(重复调用{{1 }}),并试图理解为什么,我们不允许使用geoms_语句,包括参数。

编辑2:

我对这个问题的初衷是更理论化的,因为为什么 ggplot2的编码方式不允许条件语句在geoms中包含完整的可选参数(例如,冲突或在某些情况下会产生错误?)。严一夫最初提出了一个有希望的回答,说“颜色是一个有名的论点,必须有一个名字”,尽管我希望对此进行更多的阐述/解释。

我目前的理解是,如果不复制对geoms的调用,可能无法做我想做的事情。但是,我一直在寻找的一个函数示例(不重复调用geoms)将是:

if

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

enter image description here

(如您所见,我想保留置信区间)

但是在scatterfun(mtcars,wt,mpg,T,factor(cyl)) 时不起作用:

has.Groups = FALSE

因此,对于这个问题,当我想有条件地向geom语句中添加单色时,我试图更好地理解该部分(这就是为什么在问题开始时将本节隔离出来的原因)。希望现在变得更清楚了。

2 个答案:

答案 0 :(得分:2)

场景1

如果要三行或一行:

condition <- TRUE
ggplot(mtcars,aes(x=wt,y=mpg,colour=factor(cyl))) + 
    {
        if ( condition ){
            geom_smooth() 
        } else {
            geom_smooth(color = "black")
        }
    }

enter image description here

condition <- FALSE
ggplot(mtcars,aes(x=wt,y=mpg,colour=factor(cyl))) + 
    {
        if ( condition ){
            geom_smooth() 
        } else {
            geom_smooth(color = "black")
        }
    }

enter image description here

场景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)

enter image description here

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)

enter image description here

答案 1 :(得分:1)

您可以创建一个独立的函数,有条件地添加红色平滑或默认平滑。

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)

enter image description here

ggplot(mtcars, aes(x = wt, y = mpg)) +
  smooth_condition(FALSE)

enter image description here