ggplot2 offset scatterplot points

前端 未结 4 1896
别跟我提以往
别跟我提以往 2020-12-05 19:54

I have two sets of points with error bars. I would like to offset the second so it\'s displayed slightly down from the first set, so that it doesn\'t obscure the original.<

相关标签:
4条回答
  • 2020-12-05 20:03

    Reorganise your data into a data frame.

    x = runif(4,-2,2)
    x_1 = runif(4,-1,3)
    dfr <- data.frame(
      x = c(x, x_1),
      y = rep(c("A","B","C","D"), 2),
      upper = c(x+2, x_1+1),
      lower = c(x-2, x_1-2),
      type = rep(c("alpha", "beta"), each = 4)
    )
    

    Add a column that is a numeric version of the factor y.

    dfr$y_numeric <- with(dfr, 
      as.numeric(y) - ifelse(type == "alpha", 0, 0.1)
    )
    
               x y    upper       lower  type y_numeric
    1 0.16694617 A 2.166946 -1.83305383 alpha       1.0
    2 1.95060734 B 3.950607 -0.04939266 alpha       2.0
    3 1.85516860 C 3.855169 -0.14483140 alpha       3.0
    4 0.08773196 D 2.087732 -1.91226804 alpha       4.0
    5 0.74837995 A 1.748380 -1.25162005  beta       0.9
    6 0.61489655 B 1.614897 -1.38510345  beta       1.9
    7 2.31641418 C 3.316414  0.31641418  beta       2.9
    8 2.62842027 D 3.628420  0.62842027  beta       3.9
    

    Now your plotting code is simpler.

    ggplot(dfr, aes(x, y_numeric, colour = type)) +
      geom_point(size = 6) +
      geom_errorbarh(aes(xmax = upper,xmin = lower), size = 1) +
      scale_colour_grey()
    

    final image with staggered plots

    0 讨论(0)
  • 2020-12-05 20:10

    Using Richie's reorganization of your data, this is also possible purely within ggplot, without having to mess with the axis:

    dodge <- position_dodge(width=0.5)  
    p <- ggplot(dfr,aes(x=y,y=x,colour=type)) + 
            geom_point(aes(shape=type),position=dodge) +
            geom_errorbar(aes(ymax=upper,ymin=lower),position = dodge) + 
            scale_colour_manual(values = c('gray','black')) +
            scale_shape_manual(values = c(8,19)) +
            coord_flip() + 
            opts(legend.position="none")
    

    which gives me this plot:

    enter image description here

    Note: Since version 0.9.2 opts has been replaced by theme:

    + theme(legend.position = "none")
    
    0 讨论(0)
  • 2020-12-05 20:12

    In most recent ggplot2, you can set the desired dodge width to match the width of the error bar tails using position = position_dodge(width = #):

    set.seed(45)
    data <- data.frame(group = c(rep("Z", 4), rep("Y", 4)),
                       value = runif(8),
                       x = rep(c("a","b","c","d"),2))
    
    data$ll <- data$value - abs(runif(8))
    data$ul <- data$value + abs(runif(8))
    
    
    ggplot(data = data, aes(x = x, y = value, color = group)) +
      geom_point(size = 2, position = position_dodge(width = 0.2)) + 
      geom_hline(yintercept = 1, linetype = "dotted") +
      geom_errorbar(aes(ymin = ll, ymax = ul), width = 0.2, position = "dodge")
    

    0 讨论(0)
  • 2020-12-05 20:18

    Jared Lander has a fantastic script up on github that creates a new function, position_dodgev, for horizontal error bars.

    It's here: https://github.com/jaredlander/coefplot/blob/master/R/position.r

    And I found it through his original post, which has an older version that doesn't currently work with my install of ggplot2: http://www.jaredlander.com/2013/02/vertical-dodging-in-ggplot2/

    You can use his function as you would position_dodge with geom_errorbar, e.g.,

    ... + geom_errorbarh(aes(xmin = LowInner, 
        xmax = HighInner), height = 0.5, lwd = 1, position = position_dodgev(height = 0.8))
    

    This solution worked for me, as I'm faceting the plot and didn't want to mess around with creating a new column in the data.frame.

    0 讨论(0)
提交回复
热议问题