I am trying to avoid copy-pasting code and for this I need to create dynamic plots with ggplot()
. However, it is difficult to get to work. I got it to work with the lm()
part of it (see previous question here), however, the ggplot()
is giving me trouble. I tried various solutions (see code). I found a working but stupid solution. Anyone have a better solution to using dynamic variables with ggplot()
?
#Some test data
test = data.frame(gender=c(rep("Male",5),rep("Female",5)),
WM=round(rnorm(10)*100),
brain.g = round(rnorm(10)*100))
#plot function
plot.gender.scatter = function(data, dep.var, ind.var, gender.var) {
#check types
if (!is.character(dep.var) | !is.character(ind.var) | !is.character(gender.var)) {
return("Input vars must be as strings.")
}
if (!is.data.frame(data)) {
return("Data must be a data.frame.")
}
#models
model = lm(get(dep.var) ~ get(ind.var), data) #common model
model.M = lm(get(dep.var) ~ get(ind.var), subset(data, get(gender.var)=="Male")) #male
model.F = lm(get(dep.var) ~ get(ind.var), subset(data, get(gender.var)=="Female")) #female
#plot it
#ggplot(data, aes(x=ind.var, y=dep.var, color=gender.var)) +
#ggplot(data, aes(x=data[ind.var], y=data[dep.var], color=data[gender.var])) +
#ggplot(data, aes(x=get(ind.var), y=get(dep.var), color=get(gender.var)) +
#ggplot(data, aes(x=get(data[ind.var]), y=get(data[dep.var]), color=get(data[gender.var]))) +
#ggplot(data, aes(x=eval(parse(text=ind.var)), y=eval(parse(text=dep.var)), color=eval(parse(text=gender.var)))) +
string = paste0("ggplot(data, aes(x=",ind.var,", y=", dep.var, ", color=",gender.var,")) + geom_point()")
print(string)
eval(parse(text=string))
}
plot.gender.scatter(test, "WM", "brain.g", "gender")