gpt4 book ai didi

r - 使用 ggplot2 显示堆叠直方图中 bin 元素的总数

转载 作者:行者123 更新时间:2023-12-05 01:46:58 33 4
gpt4 key购买 nike

我想在 ggplot2 中的堆叠条形图上显示数据值。经过多次尝试,我发现显示总量(对于每个 bean)的唯一方法是使用以下代码

set.seed(1234)

df <- data.frame(
sex=factor(rep(c("F", "M"), each=200)),
weight=round(c(rnorm(200, mean=55, sd=5), rnorm(200, mean=65, sd=5)))
)

p<-ggplot(df, aes(x=weight, fill=sex, color=sex))
p<-p + geom_histogram(position="stack", alpha=0.5, binwidth=5)

tbl <- (ggplot_build(p)$data[[1]])[, c("x", "count")]
agg <- aggregate(tbl["count"], by=tbl["x"], FUN=sum)

for(i in 1:length(agg$x))
if(agg$count[i])
p <- p + geom_text(x=agg$x[i], y=agg$count[i] + 1.5, label=agg$count[i], colour="black" )

生成以下图:

enter image description here

有没有更好(更有效)的方法来使用 ggplot2 获得相同的结果?提前致谢

最佳答案

您可以使用stat_bin 来计算值并添加文本标签。

p <- ggplot(df, aes(x=weight)) +
geom_histogram(aes(fill=sex, color=sex),
position="stack", alpha=0.5, binwidth=5) +
stat_bin(aes(y=..count.. + 2, label=..count..), geom="text", binwidth=5)

我将 fillcolor 美学移至 geom_histogram 以便它们仅应用于该层而不是全局应用于整个地 block ,因为我们希望 stat_bin 为每个 bin 生成总计数,而不是为每个级别的 sex 单独计数。 ..count..stat_bin 返回的一个内部变量,用于存储计数。

enter image description here

在这种情况下,直接添加计数就很简单了。然而,在更复杂的情况下,您有时可能希望在 ggplot 之外汇总数据,然后将汇总数据提供给 ggplot。在这种情况下,您可以这样做:

library(dplyr)

counts = df %>% group_by(weight = cut(weight, seq(30,100,5), right=FALSE)) %>%
summarise(n = n())

countsByGroup = df %>% group_by(sex, weight = cut(weight, seq(30,100,5), right=FALSE)) %>%
summarise(n = n())

ggplot(countsByGroup, aes(x=weight, y=n, fill=sex, color=sex)) +
geom_bar(stat="identity", alpha=0.5, width=1) +
geom_text(data=counts, aes(label=n, y=n+2), colour="black")

或者,您可以只创建 countsByGroup,然后在 ggplot 中动态创建与 counts 等效的内容:

ggplot(countsByGroup, aes(x=weight, y=n, fill=sex, color=sex)) +
geom_bar(stat="identity", alpha=0.5, width=1) +
geom_text(data=countsByGroup %>% group_by(weight) %>% mutate(n=sum(n)),
aes(label=n, y=n+2), colour="black")

关于r - 使用 ggplot2 显示堆叠直方图中 bin 元素的总数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33026512/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com