见这里的情节:
(来自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_
?
答案 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)
答案 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))
这会给我们带来