我将使用ggplot中的钻石数据集来说明我的观点,我想绘制一个直方图的价格,但我想显示每个切割的每个仓的计数 这是我的代码
ggplot(aes(x = price ) , data = diamonds_df) +
geom_histogram(aes(fill = cut , binwidth = 1500)) +
stat_bin(binwidth= 1500, geom="text", aes(label=..count..) ,
vjust = -1) +
scale_x_continuous(breaks = seq(0 , max(stores_1_5$Weekly_Sales) , 1500 )
, labels = comma)
这是我目前的情节
但正如您所看到的那样,数字显示每个箱子上所有切口的数量,我想显示每个箱子上每个切口的数量。
如果我能够配置Y轴而不是在步骤5000显示数字,我可以手动配置
,这也是一个奖励点答案 0 :(得分:17)
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
作为cut
美学添加到group
,以获取stat_bin
的每个值的计数。我还将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))
或您喜欢的任何内容。
答案 1 :(得分:0)
现在有了GGPLOT 2.2.0的position_stack选项使操作更加简单
library(ggplot2)
s <- ggplot(mpg, aes(manufacturer, fill = class))
s + geom_bar(position = "stack") +
theme(axis.text.x = element_text(angle=90, vjust=1)) +
geom_text(stat='count', aes(label=..count..), position = position_stack(vjust = 0.5),size=4)