0

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")
Community
  • 1
  • 1
CoderGuy123
  • 6,219
  • 5
  • 59
  • 89
  • 1
    take the first one and use `aes_string` instead of `aes`, also it is missing `geom_point`. [similar question](http://stackoverflow.com/questions/15458526/r-pass-variable-column-names-to-ggplot2) – rawr Apr 03 '15 at 18:55
  • `geom_point()` is below, I only saved the first line of the various solutions I tried since the rest are identical. But thanks, it works with `aes_string()`. I spent perhaps 2 hours trying these other solutions and searching without luck. Can you post the `aes_string()` solution as an answer? – CoderGuy123 Apr 03 '15 at 19:10

0 Answers0