首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用百分比标签填充桶形图

用百分比标签填充桶形图
EN

Stack Overflow用户
提问于 2019-04-14 22:06:15
回答 1查看 3.4K关注 0票数 2

我想做一个简单的桶形图,我有一个变量x (A,B,C,D)分类,另一个y(是,否),我用来填充,和一组观察,我想显示一个填充的桶形图,在每一列中都有百分比标签。

像这样简单的事情:

到目前为止,ggplot系统一直是一个梦魇。我在已经问过的问题中找不到任何解决办法。

代码语言:javascript
复制
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")

这就是我目前所取得的成果,也是定位的一部分,它显示每个类别和状态的计数,为什么不能显示比例呢?以及,我希望避免操作数据,并向dataframe添加一些内容。

非常感谢。

编辑:请求的数据框架

代码语言:javascript
复制
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变量来操作dataset:

代码语言:javascript
复制
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)
EN

回答 1

Stack Overflow用户

发布于 2019-04-14 23:24:08

给定您的数据,先计算出预分值,然后计算相应的y值并绘制它,如您在注释中链接的帖子中所描述的:

代码语言:javascript
复制
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)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55680449

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档