R 如何在ggplot2中绘制(复杂的)堆叠条形图,而无需复杂的手动数据聚合

R 如何在ggplot2中绘制(复杂的)堆叠条形图,而无需复杂的手动数据聚合,r,ggplot2,R,Ggplot2,我想绘制一个(刻面)堆叠条形图,其中X轴以百分比表示。频率标签也显示在条形图中 在做了相当多的工作并查看了有关stackoverflow的许多不同问题之后,我找到了一个关于如何使用ggplot2解决此问题的解决方案。但是,我没有直接使用ggplot2,而是通过表调用手动聚合数据。我以一种复杂的方式进行手动聚合,并使用临时变量手动计算百分比值(请参阅源代码注释“手动聚合数据”) 如果没有手动和复杂的数据聚合,我如何能够以更好的方式绘制相同的图 library(ggplot2) library(sc

我想绘制一个(刻面)堆叠条形图,其中X轴以百分比表示。频率标签也显示在条形图中

在做了相当多的工作并查看了有关stackoverflow的许多不同问题之后,我找到了一个关于如何使用ggplot2解决此问题的解决方案。但是,我没有直接使用ggplot2,而是通过表调用手动聚合数据。我以一种复杂的方式进行手动聚合,并使用临时变量手动计算百分比值(请参阅源代码注释“手动聚合数据”)

如果没有手动和复杂的数据聚合,我如何能够以更好的方式绘制相同的图

library(ggplot2)
library(scales)

library(gridExtra)
library(plyr)

##
##  Random Data
##
fact1 <- factor(floor(runif(1000, 1,6)),
                      labels = c("A","B", "C", "D", "E"))

fact2 <- factor(floor(runif(1000, 1,6)),
                      labels = c("g1","g2", "g3", "g4", "g5"))

##
##  STACKED BAR PLOT that scales x-axis to 100%
##

## manually aggregate data
##
mytable <- as.data.frame(table(fact1, fact2))

colnames(mytable) <- c("caseStudyID", "Group", "Freq")

mytable$total <- sapply(mytable$caseStudyID,
                        function(caseID) sum(subset(mytable, caseStudyID == caseID)$Freq))

mytable$percent <- round((mytable$Freq/mytable$total)*100,2)

mytable2 <- ddply(mytable, .(caseStudyID), transform, pos = cumsum(percent) - 0.5*percent)


## all case studies in one plot (SCALED TO 100%)

p1 <- ggplot(mytable2, aes(x=caseStudyID, y=percent, fill=Group)) +
    geom_bar(stat="identity") +
    theme(legend.key.size = unit(0.4, "cm")) +
    theme(axis.text.x = element_text(angle = 60, hjust = 1)) +
    geom_text(aes(label = sapply(Freq, function(x) ifelse(x>0, x, NA)), y = pos), size = 3) # the ifelse guards against printing labels with "0" within a bar


print(p1)
库(ggplot2)
图书馆(比例尺)
图书馆(gridExtra)
图书馆(plyr)
##
##随机数据
##

事实1在制作数据后:

fact1 <- factor(floor(runif(1000, 1,6)),
                  labels = c("A","B", "C", "D", "E"))

fact2 <- factor(floor(runif(1000, 1,6)),
                  labels = c("g1","g2", "g3", "g4", "g5"))

dat = data.frame(caseStudyID=fact1, Group=fact2)

我不知道是否有办法自动生成文本标签。如果您希望使用ggplot计算的内容而不是单独进行计算,则可以使用
ggplot\u build
访问堆叠图中的位置和计数

p = ggplot(dat, aes(caseStudyID, fill=Group)) + geom_bar(position="fill")
ggplot_build(p)$data[[1]]
它将返回一个数据帧,其中包括可用于创建定位标签的
count
x
y
ymin
ymax
变量

如果希望标签在每个类别中垂直居中,请首先使用介于
ymin
ymax
之间的值创建一列

freq = ggplot_build(p)$data[[1]]
freq$y_pos = (freq$ymin + freq$ymax) / 2
然后使用
注释将标签添加到图形中

p + annotate(x=freq$x, y=freq$y_pos, label=freq$count, geom="text", size=3)

如果案例研究ID在各组中的分布为单个向量,则可以使用sjPlot包中的函数

A <- floor(runif(1000, 1,6))
B <- floor(runif(1000, 1,6))
C <- floor(runif(1000, 1,6))
D <- floor(runif(1000, 1,6))
E <- floor(runif(1000, 1,6))

mydf <- data.frame(A,B,C,D,E)
sjp.stackfrq(mydf, legendLabels = c("g1","g2", "g3", "g4", "g5"))

A PS:与大多数SO用户相比,我所处的时区不同,我可能需要14个小时来回答评论或做出任何反应。
A <- floor(runif(1000, 1,6))
B <- floor(runif(1000, 1,6))
C <- floor(runif(1000, 1,6))
D <- floor(runif(1000, 1,6))
E <- floor(runif(1000, 1,6))

mydf <- data.frame(A,B,C,D,E)
sjp.stackfrq(mydf, legendLabels = c("g1","g2", "g3", "g4", "g5"))