R Ggplot用百分比标签填充条形图

R Ggplot用百分比标签填充条形图,r,ggplot2,data-visualization,R,Ggplot2,Data Visualization,我想做一个简单的条形图,我有一个变量x(a,B,C,D)分类,另一个变量y(是,否)用于填充,还有一组观察值,我想显示一个填充的条形图,每列都有百分比标签 像这样简单的事情: 到目前为止,ggplot图层系统一直是一场噩梦。我在已经提出的问题中找不到解决办法 x11() ggplot(data=KS, aes(x=KS$main_category, fill=KS$state)) + geom_bar(position="fill") + scale_y_continuous(

我想做一个简单的条形图,我有一个变量x(a,B,C,D)分类,另一个变量y(是,否)用于填充,还有一组观察值,我想显示一个填充的条形图,每列都有百分比标签

像这样简单的事情:

到目前为止,ggplot图层系统一直是一场噩梦。我在已经提出的问题中找不到解决办法

x11()
ggplot(data=KS, aes(x=KS$main_category, fill=KS$state)) +
    geom_bar(position="fill") +
    scale_y_continuous(labels = percent) +
    geom_text(aes(label = ..count.., group = KS$state), 
              stat = "count")
这是我到目前为止得到的,定位的一部分显示每个类别和状态的计数,为什么不能显示比例?。而且我希望避免操纵数据和向数据帧添加内容

非常感谢

编辑:请求的数据帧

library("ggplot2")
library("scales")

main_category=c('A','A','B','C','D','A','A','B','C','D','A','A','B','C','D','A','A','B','C','D')
state=c('Yes', 'No', 'Yes', 'Yes','Yes', 'No', 'Yes', 'Yes','Yes', 'No', 'Yes', 'Yes','Yes', 'No', 'Yes', 'Yes', 'No', 'No', 'No', 'No')
KS = data.frame(main_category, state)
编辑2:

通过使用隐式ggplot变量,我能够在不操纵数据集的情况下找到自己的解决方案:

geom_text(aes( y=..count../tapply(..count.., ..x.. ,sum)[..x..], label=percent(..count../tapply(..count.., ..x.. ,sum)[..x..]) ),
              stat="count", position=position_fill(0.5), vjust=0.5)

根据您的数据,首先计算前面的符号,然后计算相应的y值,并按照您在评论中链接的帖子中所述进行绘图:

library("ggplot2")
library("scales")
library(dplyr)

main_category=c('A','A','B','C','D','A','A','B','C','D','A','A','B','C','D','A','A','B','C','D')
state=c('Yes', 'No', 'Yes', 'Yes','Yes', 'No', 'Yes', 'Yes','Yes', 'No', 'Yes', 'Yes','Yes', 'No', 'Yes', 'Yes', 'No', 'No', 'No', 'No')
KS = data.frame(main_category, state)

cnt <- KS %>% group_by(main_category, state) %>% summarise(n=n())
pcnt <- do.call(rbind,
  lapply(split(cnt, cnt$main_category), function(x){x[x$state=='Yes', 'n']/sum(x$n)})
  )
names(pcnt) <- 'pcnt'
pcnt$main_category <- rownames(pcnt)
pcnt$state='Yes'
pcnt2 <- do.call(rbind,
                lapply(split(cnt, cnt$main_category), function(x){x[x$state=='No', 'n']/sum(x$n)})
)
names(pcnt2) <- 'pcnt'
pcnt2$main_category <- rownames(pcnt2)
pcnt2$state='No'
KS <- merge(KS, rbind(pcnt, pcnt2))

KS$labelpos <- ifelse(KS$state=='Yes',
                      KS$pcnt/2, 1 - KS$pcnt/2)


gg <- ggplot(data=KS, aes(x=main_category, fill=state)) 
gg <- gg + geom_bar(position="fill")
gg <- gg + geom_text(aes(label = paste0(100*pcnt,"%"),y=labelpos),size = 3)
gg <- gg + scale_y_continuous(labels = scales::percent)
print(gg)
库(“ggplot2”)
图书馆(“天平”)
图书馆(dplyr)
主要类别=c('A','A','B','c','D','A','A','B','c','D','A','A','B','c','D','A','A','A','A','B','c','D'))
状态=c(‘是’、‘否’、‘是’、‘是’、‘否’、‘是’、‘是’、‘否’、‘是’、‘是’、‘否’、‘是’、‘是’、‘否’、‘否’)
KS=数据帧(主类别、状态)
cnt%分组依据(主类别,状态)%>%汇总(n=n())

当然,这至少与以前提出的问题非常相似。你应该展示你在搜索中发现的内容,并解释之前的答案中缺少的内容。任何问题都不是指计算观察值,而是基于一些预处理的y轴数量应用百分比,我没有。
KS
中的部分或全部数据。我同意@42-,以前有人问过这个问题的许多变体,我相信一些现有问题和答案的组合会回答这个问题。我添加了KS dataframe。我故意拒绝接受ggplot活动应受到“避免操纵数据”请求约束的概念,因为这是ggplot系统用户的明确期望。谢谢,所以除了修改数据帧之外,没有其他方法了?我希望有一些内部变量,比如..count。。可以使用