ggplot2:将geom_bar基线设置为1而不是零

CYT*_*CYT 8 r bar-chart ggplot2 geom-bar

我正在尝试制作比率条形图(使用geom_bar),并希望将x轴设置为y = 1.因此,比率<1将低于轴线,比率> 1将高于轴线.我可以用geom_point做类似的事情:

ggplot(data, aes(x=ratio, y=reorder(place,ratio)))+geom_point()+geom_vline(xintercept=1.0)+coord_flip()
Run Code Online (Sandbox Code Playgroud)

然而,geom_bar会更受欢迎...理想情况下,图形看起来像这样:http://i.stack.imgur.com/isdnw.png,除了"负"条形将比率<1.

非常感谢你的帮助!

C

eip*_*i10 9

您可以将geom_bar基线转换为1(而不是零),如下所示:

  1. 将数据移位-1,使其ratio=1变为零,因此用作基线.

  2. 在y轴标签上添加1,以便它们反映实际数据值.

    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)
    
    Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


Her*_*oka 7

第二种方法是使用geom_segment.这允许您保留"原始"y轴.

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)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


Gre*_*gor 6

我们可以通过 y 尺度的自定义转换来做到这一点:

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))
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

这种方法非常通用并且是参数化的。


使用数据eipi10的答案:dat = data.frame(ratio=-4:11/3, x=1:16)