为什么下面的方法不起作用?
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)
,它也会发生冲突,因此它并不等同于完全没有自变量。 这确实是我要解决的问题/解决方法。例如:
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_
语句,包括参数。
我对这个问题的初衷是更理论化的,因为为什么 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
(如您所见,我想保留置信区间)
但是在scatterfun(mtcars,wt,mpg,T,factor(cyl))
时不起作用:
has.Groups = FALSE
因此,对于这个问题,当我想有条件地向geom语句中添加单色时,我试图更好地理解该部分(这就是为什么在问题开始时将本节隔离出来的原因)。希望现在变得更清楚了。
答案 0 :(得分:2)
如果要三行或一行:
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")
}
}
为清楚起见,您总是希望每个组有三条单独的回归线。但是,与此同时,您还想为数据创建条件回归线,而与组无关。
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)
答案 1 :(得分:1)