1

我正在尝试获取发生在 4 个位置(1、2、3、4 - 下文)的事件数据(A、B、C 和 D - 下文)。我想将它们绘制为填充的堆积条,以显示每个事件(A、B、C、D)对该位置的贡献,并且我想显示这些贡献的整数值。我不仅想查看单个值(如下所示),还想查看总贡献——我不知道该怎么做。

所以有两个问题:1:不仅打印堆叠条的各个值,而且(甚至,单独/仅)打印顶部的总值。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)

我想对此进行总结 - 所以这里是 table()

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

现在回到使用 ggplot 进行绘图的 data.frame:

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" 我似乎无法做到这一点总结价值。

谢谢!

4

2 回答 2

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")

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

于 2014-06-10T21:00:50.267 回答
1

好的,首先让我们取一些合理的名称,因为当您的文本总是在谈论“事件”和“位置”,而您的变量名称是aandb时,很容易混淆。此外,由于您的位置是分类的,我们将确保它们被编码为一个因素。

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)

在此处输入图像描述

于 2014-06-10T20:56:03.450 回答