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

时间:2016-02-10 20:08:46

标签: r ggplot2 bar-chart 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()

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

非常感谢你的帮助!

C

3 个答案:

答案 0 :(得分:8)

您可以将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(breaks=-3:3, labels=-3:3 + 1)
    
  3. enter image description here

答案 1 :(得分:6)

要考虑的第二种方法是使用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)

enter image description here

答案 2 :(得分:1)

我们可以通过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))

enter image description here

这种方法非常通用,并且已经参数化。


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