R - 使用ggplot2的堆积条形图的总体百分比

时间:2014-11-19 02:15:56

标签: r ggplot2

我有一些如下所示的数据。我的目标是为它们生成堆积条形图,但我需要将值显示为百分比。我已经成功地将数据融化到正确的形状并绘制堆积的条形图,但是值远远超过100%(在我的实际数据集中,一些值加起来超过8000+)。设置ggplot2的正确方法是什么,以便我可以按百分比创建堆积条形图?

#Raw Data
x   A    B    C
1   5   10   14
1   4    4   14
2   5   10   14
2   4    4   14
3   5   10   14
3   4    4   14

#Aggregate
data < read.table(...); 
data <- aggregate(. ~ x, data, sum) #<---- Sum to Average? 
x   A    B    C
1   9   14   28
2   9   14   28
3   9   14   28

#Melt Data
data <- melt(data,"x")
  x variable value
1 1        A     9
2 2        A     9
3 3        A     9
4 1        B    14
5 2        B    14
6 3        B    14
7 1        C    28
8 2        C    28
9 3        C    28

#Plot stack bar chart counts
ggplot(data, aes(x=1, y=value, fill=variable)) + geom_bar(stat="identity") + facet_grid(.~x)

我希望在熔化之前得到这样的东西,这样我就可以将它融化并将其绘制成堆积条形图,但我不确定如何处理它。

#Ideal Data Format - After Aggregate, Before Melt
x     A       B       C
1   17.64   27.45   54.90
2   17.64   27.45   54.90
3   17.64   27.45   54.90

问:使用ggplot2创建带百分比的堆积条形图的正确方法是什么?


1 个答案:

答案 0 :(得分:2)

您可以使用您的熔体数据计算比例。然后,你可以画一个数字。在这里,您可以使用x包中的group_by计算每个dplyr级别的比例。你还有其他选择。如果您想阅读mutate行,就像“对于x的每个级别,我想得到percent。”为了删除分组变量x,我最后添加了ungroup()

library(dplyr)
library(ggplot2)

### foo is your melt data
ana <- mutate(group_by(foo, x), percent = value / sum(value) * 100) %>%
       ungroup()

### Plot once
bob <- ggplot(data = ana, aes(x = x, y = percent, fill = variable)) +
       geom_bar(stat = "identity") +
       labs(y = "Percentage (%)")

### Get ggplot data
caroline <- ggplot_build(bob)$data[[1]]

### Create values for text positions
caroline$position = caroline$ymax + 1

### round up numbers and convert to character. Get unique values
foo <- unique(as.character(round(ana$percent, digits = 2)))

### Create a column for text
caroline$label <- paste(foo,"%", sep = "")

### Plot again
bob + annotate(x = caroline$x, y = caroline$position,
               label = caroline$label, geom = "text", size=3) 

enter image description here

数据

foo <-structure(list(x = c(1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L), variable = structure(c(1L, 
1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L), .Label = c("A", "B", "C"), class = "factor"), 
value = c(9L, 9L, 9L, 14L, 14L, 14L, 28L, 28L, 28L)), .Names = c("x", 
"variable", "value"), class = "data.frame", row.names = c("1", 
"2", "3", "4", "5", "6", "7", "8", "9"))