【问题标题】:Ggplot filled barplot with percentage labels [duplicate]Ggplot用百分比标签填充条形图[重复]
【发布时间】:2019-04-14 22:06:15
【问题描述】:

我想制作一个简单的条形图,我有一个变量 x (A,B,C,D) 分类变量,另一个用于填充的 y (YES, NO),以及一组观察结果,我想要显示一个填充的条形图,每列中都有百分比标签。

就这么简单:

到目前为止,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 轴数量应用百分比。 stackoverflow.com/questions/44724580/…
  • Please provide KS 中的部分或全部数据。我同意@42-,这个问题的许多变体之前已经被问过,我相信现有问题和答案的一些组合会回答这个问题。
  • 我已经添加了 KS 数据框。
  • 我故意拒绝接受 ggplot 活动应该受到“避免操纵数据”请求的约束,因为这是 ggplot 系统用户的明确期望。

标签: r ggplot2 data-visualization


【解决方案1】:

鉴于您的数据首先计算百分比,然后计算相应的 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)

【讨论】:

  • 谢谢,除了修改数据框别无他法?我希望可以使用一些内部变量,如 ..count..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-01
  • 1970-01-01
相关资源
最近更新 更多