Search code examples
rggplot2jitter

ggplot2. How to add jitter on the different graph


So I have this code

  ggplot(data, aes(x=price, y=values)) + 
# add colourful lines
  geom_line(aes(group=group, color=group)) + 
# add two box plots
  geom_boxplot(data=df, aes(x="z_lnprice_new", y=x_lnprice_new)) + 
  geom_boxplot(data=df, aes(x='a_lnprice_new', y=b_lnprice_old)) +
# delete the legend
  theme(legend.position="none")

and have this graph:

first

Also I want to add the jitter on the boxplots. But if I just add

  + geom_jitter(alpha=0.5, aes(price, values, color=group), 
            position = position_jitter(width = .2))

I'm having the jitter on the lines geom_line, but not on the boxplots.

second

Is that possible?


P.S.: the whole chunk of code with data Google Drive, .csv, 25 kB

df <- data.frame(b_lnprice_old= sort(nb_firm_two_price[[175]]),
                 x_lnprice_new  = sort(nb_firm_two_price[[176]]))

data <- data.frame(group = factor(1:nrow(df)), 
                   price=c(rep('b_lnprice_old',nrow(df)), 
                         rep('x_lnprice_old',nrow(df))), 
                   values=c(df$b_lnprice_old,df$x_lnprice_new))

ggplot(data, aes(x=price, y=values)) + 
  geom_line(aes(group=group, color=group)) + 

  geom_boxplot(data=df, aes(x="z_lnprice_new", y=x_lnprice_new)) + 
  geom_boxplot(data=df, aes(x='a_lnprice_new', y=b_lnprice_old)) +
  theme(legend.position="none")

Solution

  • Here's an example of how to do what I think you are going for, using reproducible data.

    # reproducible random data
    set.seed(123)
    obs <- 100
    dat <- data.frame(group=1:obs, old_price=rnorm(obs, mean=10))
    dat$new_price <- dat$old_price + rnorm(obs, mean=1)
    
    # libraries
    library(reshape2)
    library(ggplot2)
    
    # convert from wide to long
    plot_dat <- melt(dat, id.var='group')
    
    # plot
    ggplot(plot_dat) + 
      # simple lines
      geom_line(aes(x=variable, y=value, group=group, color=group)) +
    
      # box plots and jitter points, with modified x value
      geom_boxplot(aes(x=paste0('hist_', variable), y=value)) +
      geom_jitter(aes(x=paste0('hist_', variable), y=value, color=group)) +
    
      # specify x value order
      scale_x_discrete(limits=c('hist_old_price', 'old_price', 'new_price',
                                'hist_new_price'))
    

    Result:

    enter image description here