我有一些如下所示的数据。我的目标是为它们生成堆积条形图,但我需要将值显示为百分比。我已经成功地将数据融化到正确的形状并绘制堆积的条形图,但是值远远超过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创建带百分比的堆积条形图的正确方法是什么?
答案 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)
数据强>
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"))