ggplot2,堆积直方图和摘要标签

时间:2014-06-10 19:58:07

标签: r ggplot2 label stacked geom-bar

我正在尝试在4个位置(下面的1,2,3,4-)发生事件数据(下面的A,B,C和D)。我想将它们绘制成一个堆积条,填充以显示每个事件(A,B,C,D)对该位置的贡献 AND 我想显示这些贡献的整数值。我不仅希望看到个别价值观(以下类似的价值观),而且我还希望看到总贡献 - 我无法弄清楚该怎么做。

所以有两个问题: 1:不仅打印堆叠条的各个值,而且(或者甚至,单独/仅打印)打印顶部的总值。 2:文本标签以y值偏移打印,因此它们会相互覆盖,并且不会在条形图中排列。我更喜欢在中间或顶部的子栏内预期的地方。

a <- c(1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,1,1,1,2)
b <- c('A','B','C','D','A','A','B','C','B','B','C','C','C','D','D','A','A','B','C','D')
df <- data.frame(a, b)

我想创建一个这样的摘要 - 所以这里的表()

table(df$a, df$b)

  A B C D
1 2 2 2 1
2 2 1 1 1
3 0 2 2 0
4 1 0 1 2

现在回到data.frame,用ggplot绘图:

df2 <- data.frame(table(df$a, df$b))

然后绘制它:

library(ggplot2)
ggplot(df2, aes(x=Var1, y=Freq, fill=Var2, label=Freq)) + 
  geom_bar(stat="identity") + 
  geom_text(stat="identity")

我真的很感激帮助。我是否不需要通过表格对数据框进行总结,然后将其汇总到数据框中?我可以获得条形图的总高度并打印该标签吗?

我觉得如果我没有使用填充,我可以得到..count ..值但是stat =“bin”,但是因为我已经去了stat =“identity”我似乎无法得到那个汇总值。

谢谢!

2 个答案:

答案 0 :(得分:2)

我会总结你所拥有的数据,以便产生你想要的情节。对于标签,您还需要创建定义标签应放置在图表上的位置的变量。

a <- c(1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,1,1,1,2)
b <- c('A','B','C','D','A','A','B','C','B','B','C','C','C','D','D','A','A','B','C','D')
df <- data.frame(a, b)
df2 <- data.frame(table(df$a, df$b))

现在为整体计数创建一个变量:

df2$overall <- NA
df2$overall[1:length(unique(df2$Var1))] <- xtabs(Freq~Var1,data=df2)

现在使用ddply包为每个柱的计数创建一个变量:

library(plyr)
df2 <- ddply(df2, "Var1", transform, cumvars=cumsum(Freq))
# Remove Zeros from printing on labels
df2$Freq2 <- ifelse(df2$Freq==0,NA,df2$Freq)


library(ggplot2)

ggplot(df2, aes(x=Var1, y=Freq, fill=Var2, label=Freq)) + 
  geom_bar(stat="identity") + 
  geom_text(aes(x=Var1, y=overall, label=overall),vjust=-.2,stat="identity") + 
  geom_text(aes(x=Var1, y=cumvars, label=Freq2),vjust=1.5, colour="white", stat="identity")

您可以更改标签的大小,颜色,位置等,使图形看起来很漂亮。

答案 1 :(得分:1)

好的,首先让我们得到一些合理的名字,因为当你的文字总是在谈论“事件”和“位置”,但你的变量名称是ab时,很容易混淆。此外,由于您的位置是绝对的,我们将确保它们被编码为一个因素。

a <- c(1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,1,1,1,2)
b <- c('A','B','C','D','A','A','B','C','B','B','C','C','C','D','D','A','A','B','C','D')
df <- data.frame(a, b)
names(df) <- c("location", "event")
df$location <- factor(df$location)

随着清理完毕,ggplot将为我们完成所有摘要,至少对于条形图而言。

library(ggplot2)
ggplot(df, aes(x = location, fill = event)) + geom_bar()

我认为我们需要总结才能获得总数:

library(dplyr)
totes <- df %.% group_by(location) %.% summarize(total = n())

ggplot(df, aes(x = location)) + geom_bar(aes(fill = event)) +
    geom_text(data = totes,
              mapping = aes(y = total + .2, label = total))

在酒吧内获得个人子栏的贡献会比较棘手,我会将其作为练习留给读者或其他人回答。我还鼓励你使用堆积条形图以外的东西,这样可以更容易地比较这些数字。也许是这样的:

df.counts <- df %.% group_by(location, event) %.% summarize(n = n())

ggplot(totes, aes(x = location, y = total)) +
    geom_line(aes(group = 1), size = 1) +
    geom_line(data = df.counts, aes(y = n, color = event, group = event), size = 0.9,
              position = position_jitter(w = 0.05, h = 0.1)) +
    # jitter not pictured, but it helps with the overlapping lines
    expand_limits(y = 0) +
    annotate(geom = "text", x = 2, y = 6, label = "Total", size = 10)

enter image description here