ggplot条形图百分比组

vas*_*s85 0 charts r ggplot2

如果我执行以下命令

data(mtcars)
ggplot(data=mtcars, aes(cyl))+
  geom_bar(aes(fill=as.factor(gear), y = (..count..)/sum(..count..)), position="dodge") + 
  scale_y_continuous(labels=percent)
Run Code Online (Sandbox Code Playgroud)

我会得到 在此处输入图片说明

但是,我真正想做的是使每个gear级别的总和达到100%。所以,gear是我正在查看的子组,我想知道每个组内的分布。

我不想使用facets,也不想融合数据。有没有办法做到这一点?

Mak*_*e42 8

首先:您的代码对我来说是不可重现的(即使在包含之后也无法重现library(ggplot2))。我不确定这是否..count..是我不知道的奇特语法,但无论如何,如果我能够立即重现就更好了:-)。

话虽如此,我认为您正在寻找http://docs.ggplot2.org/current/geom_bar.html中描述的内容并将其应用于您的示例代码

library(ggplot2)
data(mtcars)
mtcars$gear <- as.factor(mtcars$gear)
ggplot(data=mtcars, aes(cyl))+
  geom_bar(aes(fill=as.factor(gear)), position="fill")
Run Code Online (Sandbox Code Playgroud)

产生

在此输入图像描述

这是你想要的?


事后思考:学习melt()或其替代方案是必须的。然而,对于大多数用例来说,melt()from都是由from包继承的。reshape2gather()tidyr


Rob*_*bin 5

我正在寻找这个确切问题的答案。这是我使用从Stack Overflow收集的信息并从Sebastian熟悉..x ..,.. group ..和..count ..得出的信息(即反复试验)。西蒙的答案中提供了绍尔链接。除了ggplot之外,它不需要任何其他软件包。

library(ggplot2)
ggplot(mtcars, aes(x=as.factor(cyl), fill=as.factor(gear)))+
  geom_bar(aes( y=..count../tapply(..count.., ..x.. ,sum)[..x..]), position="dodge" ) +
  geom_text(aes( y=..count../tapply(..count.., ..x.. ,sum)[..x..], label=scales::percent(..count../tapply(..count.., ..x.. ,sum)[..x..]) ),
            stat="count", position=position_dodge(0.9), vjust=-0.5)+
  ylab('Percent of Cylinder Group, %') +
  scale_y_continuous(labels = scales::percent)
Run Code Online (Sandbox Code Playgroud)

产生 在此处输入图片说明

  • 就像其他可能感兴趣的人的旁注一样:如果您不想使用 x 的百分比而是使用 fill 变量,则可以使用 ..fill.. 而不是 ..x.. (2认同)