ggplot2,将两个比例应用于同一个情节?自上而下的barplot

时间:2014-07-23 17:16:43

标签: r ggplot2

见这里的情节:

enter image description here (来自here

如何使用ggplot2重现条形图的上部和下部?

例如,我可以用

生成上半部分
ggplot(data.frame(x=rnorm(1000, 5)), aes(x=x)) + geom_bar() + scale_y_reverse()

但是现在如果我添加任何其他geom_,例如另一个geom_bar(),y的比例就会反转。是否可以将scale_y_reverse()仅应用于特定的geom_

2 个答案:

答案 0 :(得分:8)

另一种选择是制作两个单独的图并将它们与 gridExtra 包中的arrangeGrob结合使用。在玩了情节边缘后,你可以得到看起来不错的东西。

library(gridExtra)
library(ggplot2)

set.seed(100)
p2 <- ggplot(data.frame(x=rnorm(1000, 5)), aes(x=x)) + geom_bar() + theme(plot.margin=unit(c(0,0,0,0), 'lines'))
p1 <- p2 + scale_y_reverse() + 
    theme(plot.margin=unit(c(0, 0, -.8, 0), 'lines'), axis.title.x=element_blank(), 
          axis.text.x=element_blank(), axis.ticks.x=element_blank())

p <- arrangeGrob(p1, p2)
print(p)

enter image description here

答案 1 :(得分:4)

ggplot只喜欢有一个y轴刻度。最简单的方法是自己重塑数据。在这里,我们可以使用geom_rect在我们喜欢的地方绘制数据,我们可以在组时间内对其进行调整。这是一个例子

#sample data
dd<-data.frame(
  year=rep(2000:2014, 2), 
  group=rep(letters[1:2], each=15), 
  count=rpois(30, 20)
)

现在我们可以绘制它。但首先,让我们通过找到一年的最大高度并添加一些空间来定义顶部柱的偏移量

height <- ceiling(max(tapply(dd$count, dd$year, sum))*1.10)

以下是我们的绘图方式

ggplot(dd) + 
  geom_rect(aes(xmin=year-.4, xmax=year+.4, 
    ymin=ifelse(group=="a", 0, height-count), 
    ymax=ifelse(group=="a", count, height), fill=group)) + 
  scale_y_continuous(expand=c(0,0))

这会给我们带来

enter image description here