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

11,580

Solution 1

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.

Solution 2

If you don't mind using the ggplot2 package, there's an easy way to make similar graphics with geom_boxplot and geom_jitter. Using the mtcars example data:

library(ggplot2)
p <- ggplot(mtcars, aes(factor(cyl), mpg)) 
p + geom_boxplot() + geom_jitter() + theme_bw()

which produces the following graphic:

enter image description here

The documentation can be seen here: http://had.co.nz/ggplot2/geom_boxplot.html

Share:
11,580
crazian
Author by

crazian

Updated on June 24, 2022

Comments

  • crazian
    crazian about 2 years

    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.

  • crazian
    crazian almost 12 years
    Thanks csgillespie, your number 2 link actually gave me pretty much what I needed. But both are great solutions. I tweaked quite some for my own use.
  • crazian
    crazian almost 12 years
    The purpose of doing this is to be able to show the medians for both groups, as well as the data points, and the outliers all in one plot frame. Here is the code:
  • csgillespie
    csgillespie almost 12 years
    @user1322919 No easy solution for that. I would ask another question