请查看图形:
(来源:这里)
我如何使用ggplot2复制条形图的上半部分和下半部分?
例如,我可以使用以下代码生成上半部分:
ggplot(data.frame(x=rnorm(1000, 5)), aes(x=x)) + geom_bar() + scale_y_reverse()
然而现在,如果我添加任何其他的geom_
,例如另一个geom_bar()
,y轴的比例就会反转。是否可能仅将scale_y_reverse()
应用于特定的geom_
?
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)
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))
这将给我们带来: