ggplot2: Setting geom_bar baseline to 1 instead of zero

前端 未结 3 1858
[愿得一人]
[愿得一人] 2020-11-30 14:01

I\'m trying to make a bar graph (with geom_bar) of ratios, and would like to set the x-axis at y=1. Therefore, ratios <1 would be below the axis and ratios >1 would be ab

相关标签:
3条回答
  • 2020-11-30 14:25

    A second approach to consider is to use geom_segment. This allows you to keep the 'original' y-axis.

    set.seed(123)
    dat <- data.frame(x=1:10, ratio=sort(runif(10,0,2)))
    
    #create flag
    dat$col_flag <- dat$ratio > 1
    
    ggplot(dat, aes(color=col_flag)) +
      geom_segment(aes(x=x,xend=x,y=1, yend=ratio), size=15)
    

    0 讨论(0)
  • 2020-11-30 14:28

    You can shift the geom_bar baseline to 1 (instead of zero) as follows:

    1. Shift the data by -1, so that ratio=1 becomes zero and is therefore used as the baseline.

    2. Add 1 to the y-axis labels so that they reflect the actual data values.

      dat = data.frame(ratio=-4:11/3, x=1:16)
      
      ggplot(dat, aes(x, ratio-1, fill=ifelse(ratio-1>0,"GT1","LT1"))) +
        geom_bar(stat="identity") +
        scale_fill_manual(values=c("blue","red"), name="LT or GT 1") +
        scale_y_continuous(labels = function(y) y + 1)
      

    0 讨论(0)
  • 2020-11-30 14:28

    We can do this with a custom transformation of the y-scale:

    shift_trans = function(d = 0) {
      scales::trans_new("shift", transform = function(x) x - d, inverse = function(x) x + d)
    }
    
    ggplot(dat, aes(x, ratio, fill = ifelse(ratio > 1,"GT1","LT1"))) +
      geom_bar(stat="identity") +
      scale_fill_manual(values=c("blue","red"), name="LT or GT 1") +
      scale_y_continuous(trans = shift_trans(1))
    

    This approach is nicely general and is parmaterized.


    Using the data eipi10's answer: dat = data.frame(ratio=-4:11/3, x=1:16)

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