ggplot关于群体百分比的条形图

时间:2016-05-03 15:47:57

标签: r charts 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)

我会得到enter image description here

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

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

3 个答案:

答案 0 :(得分:5)

我正在寻找这个确切问题的答案。这就是我使用Stack Overflow汇集在一起​​的信息,并从{{.. ..,.. group ..和..count ..中获取熟悉的信息(即试错) Simon的回答中提供了{3}}链接。除了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)

可生产 Sebastian Sauer

答案 1 :(得分:1)

首先:您的代码对我来说是不可复制的(即使包括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")

产生

enter image description here

这是你在找什么?

事后补充:学习melt()或其替代品是必须的。但是,来自melt()的{​​{1}} reshape2来自gather()来自tidyr的大多数用例。

答案 2 :(得分:1)

以下是有关如何从Sebastian Sauer执行此操作的良好资源。解决问题的最快方法是方式4,其中..prop..代替(..count..)/sum(..count)

# Dropping scale_y_continuous, since you do not define percent
ggplot(data=mtcars, aes(cyl))+
  geom_bar(aes(fill=as.factor(gear), y = (..count..)/sum(..count..)), 
position="dodge")

我使用的另一种方法与链接页面中的方式1类似,是使用dplyr来计算百分比,并使用stat = 'identity'在条形图中使用y美学图:

mtcars %>%
  mutate(gear = factor(gear)) %>%
  group_by(gear, cyl) %>%
  count() %>%
  group_by(gear) %>%
  mutate(percentage = n/sum(n)) %>%
  ggplot(aes(x = cyl, y = percentage, fill = gear)) +
    geom_bar(position = 'dodge', stat = 'identity')