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
您可以将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(labels = function(y) y + 1)
Run Code Online (Sandbox Code Playgroud)第二种方法是使用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)
我们可以通过 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)