I'm trying to make a function that can take either a single group, or several groups, while using a single colour
argument. However, there seems to be a problem in specifying colour
both globally (in aes()
) and locally (in geom_smooth()
). Looks like aes()
doesn't accept colour=NULL
or just left empty colour=
.
Plot without groups (works)
scatterfunction <- function (Data=mtcars,Predictor=mtcars$wt,Response=mtcars$mpg,what.Colour="purple") {
library(ggplot2)
ggplot(Data,aes(x=Predictor,y=Response)) +
geom_smooth(method="lm",colour=what.Colour)
}
scatterfunction()
Plot with groups (works)
groupscatterfunction <- function (Data=mtcars,Predictor=mtcars$wt,Response=mtcars$mpg,Group.variable=factor(mtcars$cyl),what.Colour=c("purple", "yellow", "brown")) {
library(ggplot2)
ggplot(Data,aes(x=Predictor,y=Response,colour=Group.variable)) +
geom_smooth(method="lm") +
scale_color_manual(values=what.Colour)
}
groupscatterfunction()
Plot without groups, conditional (works when has.Groups=F
)
conditionalscatterfunction <- function (Data=mtcars,Predictor=mtcars$wt,Response=mtcars$mpg,Group.variable=factor(mtcars$cyl),has.Groups=F,what.Colour="purple") {
library(ggplot2)
ggplot(Data,aes(x=Predictor,y=Response,colour= if(has.Groups==T) {Group.variable})) +
geom_smooth(method="lm",colour= if(has.Groups==F){what.Colour}) +
if (has.Groups==T) {scale_color_manual(values=what.Colour)}
}
conditionalscatterfunction()
Plot with groups, conditional (doesn't work when has.Groups=T
)
conditionalscatterfunction(Data = mtcars,
Predictor = mtcars$wt,
Response = mtcars$mpg,
has.Groups = TRUE,
Group.variable = factor(mtcars$cyl),
what.Colour = c("purple", "yellow", "brown"))
Error: Aesthetics must be either length 1 or the same as the data (80): colour
Using the alternative switch()
statement has worked for me before but not here:
conditionalscatterfunction <- function (Data=mtcars,Predictor=mtcars$wt,Response=mtcars$mpg,Group.variable=factor(mtcars$cyl),has.Groups=T,what.Colour=c("purple", "yellow", "brown")) {
library(ggplot2)
ggplot(Data,aes(x=Predictor,y=Response,colour= switch(has.Groups, Group.variable))) +
geom_smooth(method="lm",colour= if(has.Groups==F){what.Colour}) +
if (has.Groups==T) {scale_color_manual(values=what.Colour)}
}
conditionalscatterfunction()
Error: Aesthetics must be either length 1 or the same as the data (80): colour
It seems like as long as I add the "colour=
" statement in aesthetics()
, no matter if I leave it blank or = NULL
, I get this error. What's its default when not explicitly called then?
I would prefer avoiding repeating the whole call again because I also have this issue with geom_points()
, geom_shape()
, etc., and I would need to repeat it for each combination of elements...
Question: How can I solve this problem?