我正在尝试制作比率条形图(使用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
答案 0 :(得分:8)
您可以将geom_bar
基线转换为1(而不是零),如下所示:
将数据移动-1,以使ratio=1
变为零,因此用作基线。
在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)
答案 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)
答案 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))
这种方法非常通用,并且已经参数化。
使用数据eipi10的答案:dat = data.frame(ratio=-4:11/3, x=1:16)