这是一个没有刻面的解决方案。首先,创建数据框。我使用从 1 到 20 的值来确保没有一个值是负数(使用人口金字塔,您不会得到负数/年龄)。
test <- data.frame(v=sample(1:20,1000,replace=T), g=c('M','F'))
geom_bar()
然后分别为每个g
值组合两个调用。因为F
计数按原样计算,但M
计数乘以 -1 以获得相反方向的柱。然后scale_y_continuous()
用于获取轴的漂亮值。
require(ggplot2)
require(plyr)
ggplot(data=test,aes(x=as.factor(v),fill=g)) +
geom_bar(subset=.(g=="F")) +
geom_bar(subset=.(g=="M"),aes(y=..count..*(-1))) +
scale_y_continuous(breaks=seq(-40,40,10),labels=abs(seq(-40,40,10))) +
coord_flip()
更新
由于subset=.
在最新ggplot2
版本中不推荐使用参数,因此可以使用 function 获得相同的结果subset()
。
ggplot(data=test,aes(x=as.factor(v),fill=g)) +
geom_bar(data=subset(test,g=="F")) +
geom_bar(data=subset(test,g=="M"),aes(y=..count..*(-1))) +
scale_y_continuous(breaks=seq(-40,40,10),labels=abs(seq(-40,40,10))) +
coord_flip()