【问题标题】:ggplot bar chart of percentages over groupsggplot 组百分比条形图
【发布时间】:2016-05-03 15:47:57
【问题描述】:

如果我执行以下命令

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)

我会得到

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

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

【问题讨论】:

  • 这里是同一个问题,以一个新的数据框结束,总是有ggplot2的解决方案:stackoverflow.com/questions/36087904/…
  • “我不想做可以帮助解决问题的有用的事情” O_o
  • 我只想要在各种情况下都能适应的东西,这样我就可以快速地将某些变量与其他变量进行对比。我可能想构建一个函数,但我现在即使使用meltfacets 也遇到了麻烦。哈哈..

标签: r charts ggplot2


【解决方案1】:

我正在寻找这个确切问题的答案。这就是我使用从 Stack Overflow 汇总的信息并熟悉(即反复试验)来自@的 ..x..、..group.. 和 ..count.. 得出的结果西蒙的回答中提供了 987654321@ 链接。除了 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)

生产

【讨论】:

  • 只是作为其他可能感兴趣的人的旁注:如果您不想通过 x 而是通过填充变量来获得百分比,您可以使用 ..fill.. 而不是 ..x。 .
【解决方案2】:

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

生产

这是你要找的吗?


事后思考:必须学习 melt() 或其替代方法。但是,reshape2 中的 melt() 在大多数用例中被 tidyr 包中的 gather() 成功。

【讨论】:

  • 我想这是,我必须测试一下。看起来如果我将其更改为position="dodge",那么我将能够以非堆叠格式在cyl 的类别中看到它,对吧?
  • 后续:如何使用以下代码为每个部分添加值标签:ggplot(data=mtcars, aes(cyl, y=(..count..)/sum(.. count..)))+ geom_bar(aes(fill=as.factor(gear)), position="dodge")+ geom_text(aes(size=18, label = format(paste(round(100*(..count ..)/sum(..count..),1), "%",sep=""), digits=1, drop0trailing=TRUE), y= (..count..)/sum(..count ..) ), stat="count") 我的不工作。
  • @vashts85:首先,geom_text 中的size=18 不可能是正确的,其次,写一个新问题,您在其中 (a) 解释 ..count.. 的含义,以及 (b) 给出您希望看到的图像 - 我无法从您的代码中识别出来。
  • 我想得到gearcyl的每个级别中的百分比。然后我想在它上面添加标签。从某种意义上说,我只是想在 R 中建立一个工作流程,以创建您在商业环境中的标准 PPT 演示中看到的最基本的图表。
  • @vashts85: "我想得到每个级别 cyl 中装备的百分比。"我想你明白了:-)。其余的:请提出一个新问题。如果您从这里链接到它,我很高兴能回答它。如果它如此标准,您可以链接到显示它的 Internet 上的图像。 (许多商业演示“标准”很烂,所以我并没有真正遵守它们。)
【解决方案3】:

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')

【讨论】:

  • 我相信这应该是公认的解决方案,计算 geom_bar 内的两个分类变量的百分比很麻烦,使用 dplyr 函数更容易做到这一点,然后继续绘图。跨度>
【解决方案4】:

我将代码编辑为:

ggplot(data, aes(fill=bolumtam, y=Languagevalue/tapply(Languagevalue, Language ,sum)[Language], x=Language)) + 
    geom_bar(aes( y=Languagevalue/tapply(Languagevalue, Language ,sum)[Language]), position="dodge", stat="identity")+
 geom_text(aes( y=Languagevalue/tapply(Languagevalue, Language ,sum)[Language], label=scales::percent(Languagevalue/tapply(Languagevalue, Language ,sum)[Language]) ),
            stat="identity", position=position_dodge(0.9), vjust=-0.5)+
 scale_y_continuous(labels = scales::percent)

但结果如下

我想生成如下图:

【讨论】:

  • 如果您有新问题,请点击 按钮提出问题。如果有助于提供上下文,请包含指向此问题的链接。 - From Review
猜你喜欢
  • 1970-01-01
  • 2019-09-05
  • 2016-04-26
  • 1970-01-01
  • 1970-01-01
  • 2022-11-15
  • 2023-04-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多