使用ggplot2

时间:2015-10-08 21:47:58

标签: r graphics ggplot2

我想在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获得相同结果是否有更好(更有效)的方法? 非常感谢提前

1 个答案:

答案 0 :(得分:4)

您可以使用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) 来计算值并添加文字标签。

fill

我将colorgeom_histogram美学移至stat_bin,以便它们仅适用于该图层,而不是全局适用于整个图,因为我们需要sex来生成每个bin的总计数,而不是每个..count..级别的单独计数。 stat_bin是由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") 返回的内部变量,用于存储计数。

enter image description here

在这种情况下,直接添加计数很简单。但是,在更复杂的情况下,您有时可能需要汇总ggplot之外的数据,然后将汇总数据提供给ggplot。在这种情况下,您将如何做到这一点:

countsByGroup

或者,您可以创建counts,然后在ggplot内动态创建等效的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")

javac pkIncremental/Incremental.java