ggplot2 2.x 更新
您现在可以在堆积条形图中居中标签,而无需使用 position=position_stack(vjust=0.5) 预先汇总数据。例如:
ggplot(aes(x = price ) , data = diamonds) +
geom_histogram(aes(fill=cut), binwidth=1500, colour="grey20", lwd=0.2) +
stat_bin(binwidth=1500, geom="text", colour="white", size=3.5,
aes(label=..count.., group=cut), position=position_stack(vjust=0.5)) +
scale_x_continuous(breaks=seq(0,max(diamonds$price), 1500))
原答案
您可以通过将cut 作为group 美学添加到stat_bin 来获取cut 的每个值的计数。我还将binwidth 移到aes 之外,这导致binwidth 在您的原始代码中被忽略:
ggplot(aes(x = price ), data = diamonds) +
geom_histogram(aes(fill = cut ), binwidth=1500, colour="grey20", lwd=0.2) +
stat_bin(binwidth=1500, geom="text", colour="white", size=3.5,
aes(label=..count.., group=cut, y=0.8*(..count..))) +
scale_x_continuous(breaks=seq(0,max(diamonds$price), 1500))
上面代码的一个问题是,我希望标签在每个条形部分中垂直居中,但我不确定如何在 stat_bin 中做到这一点,或者是否有可能。乘以 0.8(或其他)将每个标签移动不同的相对量。因此,为了使标签居中,我在下面的代码中为标签创建了一个单独的数据框:
# Create text labels
dat = diamonds %>%
group_by(cut,
price=cut(price, seq(0,max(diamonds$price)+1500,1500),
labels=seq(0,max(diamonds$price),1500), right=FALSE)) %>%
summarise(count=n()) %>%
group_by(price) %>%
mutate(ypos = cumsum(count) - 0.5*count) %>%
ungroup() %>%
mutate(price = as.numeric(as.character(price)) + 750)
ggplot(aes(x = price ) , data = diamonds) +
geom_histogram(aes(fill = cut ), binwidth=1500, colour="grey20", lwd=0.2) +
geom_text(data=dat, aes(label=count, y=ypos), colour="white", size=3.5)
要配置 y 轴上的中断,只需添加 scale_y_continuous(breaks=seq(0,20000,2000)) 或您想要的任何中断。