看这里的情节:
(从这里)
如何使用ggplot2重现条形图的上部和下部?
例如,我可以生产上部
ggplot(data.frame(x=rnorm(1000, 5)), aes(x=x)) + geom_bar() + scale_y_reverse()
Run Code Online (Sandbox Code Playgroud)
但是现在,如果我添加任何其他geom_,例如另一个geom_bar(),y的比例被反转.是否可以scale_y_reverse()仅应用于特定的geom_?
另一种选择是让两个独立的地块,并结合他们arrangeGrob从gridExtra包.玩完情节边后,你可以得到看起来不错的东西.
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)
Run Code Online (Sandbox Code Playgroud)

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)
)
Run Code Online (Sandbox Code Playgroud)
现在我们可以绘制它了。但首先,让我们通过查找一年中的最大高度并添加一些空间来定义顶部条形的偏移量
height <- ceiling(max(tapply(dd$count, dd$year, sum))*1.10)
Run Code Online (Sandbox Code Playgroud)
这就是我们如何绘制的
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))
Run Code Online (Sandbox Code Playgroud)
这会给我们带来
