Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I create a categorical scatterplot in R like boxplots?

Does anyone know how to create a scatterplot in R to create plots like these in PRISM's graphpad:

enter image description here

I tried using boxplots but they don't display the data the way I want it. These column scatterplots that graphpad can generate show the data better for me.

Any suggestions would be appreciated.

like image 752
crazian Avatar asked Sep 13 '12 04:09

crazian


1 Answers

As @smillig mentioned, you can achieve this using ggplot2. The code below reproduces the plot that you are after pretty well - warning it is quite tricky. First load the ggplot2 package and generate some data:

library(ggplot2)
dd = data.frame(values=runif(21), type = c("Control", "Treated", "Treated + A"))

Next change the default theme:

theme_set(theme_bw())

Now we build the plot.

  1. Construct a base object - nothing is plotted:

    g = ggplot(dd, aes(type, values))
    
  2. Add on the points: adjust the default jitter and change glyph according to type:

    g = g + geom_jitter(aes(pch=type), position=position_jitter(width=0.1))
    
  3. Add on the "box": calculate where the box ends. In this case, I've chosen the average value. If you don't want the box, just omit this step.

    g = g + stat_summary(fun.y = function(i) mean(i), 
            geom="bar", fill="white", colour="black")
    
  4. Add on some error bars: calculate the upper/lower bounds and adjust the bar width:

    g  = g + stat_summary(
            fun.ymax=function(i) mean(i) + qt(0.975, length(i))*sd(i)/length(i), 
            fun.ymin=function(i) mean(i) - qt(0.975, length(i)) *sd(i)/length(i),
            geom="errorbar", width=0.2)
    
  5. Display the plot

    g
    

enter image description here

  1. In my R code above I used stat_summary to calculate the values needed on the fly. You could also create separate data frames and use geom_errorbar and geom_bar.
  2. To use base R, have a look at my answer to this question.
like image 153
csgillespie Avatar answered Sep 23 '22 17:09

csgillespie