ggplot2 使用 ...prop... 和按另一个类别分组条形图的问题

Posted

技术标签:

【中文标题】ggplot2 使用 ...prop... 和按另一个类别分组条形图的问题【英文标题】:ggplot2 problems with using ...prop... and grouping bar graph by another category 【发布时间】:2018-06-13 16:05:40 【问题描述】:
StudentData <- data.frame(gender = sample( c("male","female"), 100, replace=TRUE),
              degree = sample( c("Associates", "Masters", "PhD"), 100, replace=TRUE),
              category = sample( c("Audit", "Credit"), 100, replace=TRUE))

在以下数据集中,我正在尝试创建一个条形图,以绘制按性别分隔的具有副学士、硕士或博士学位的样本百分比(使用 facet_grid() 完成)。这是我到目前为止生成的:

StudentData %>% ggplot(., aes(x=degree, group=gender)) + 
            geom_bar(aes(y=..prop..), stat="count", position=position_dodge()) +
            geom_text(aes(label=scales::percent(round(..prop..,2)), 
            y=..prop..), stat="count", vjust=-.5) +
            scale_y_continuous(limits=c(0,1),labels = scales::percent) +
            ylab("Percent of Sample") +
            facet_grid(~gender)

但是,我还想将每个图表上的“审计”和“信用”组之间的差异并排显示。然而,当我在 ggplot 的美学中添加“fill=category”时,什么都没有改变:

StudentData %>% ggplot(., aes(x=degree, group=gender, fill=category)) + 
            geom_bar(aes(y=..prop..), stat="count", position=position_dodge()) +
            geom_text(aes(label=scales::percent(round(..prop..,2)), 
            y=..prop..), stat="count", vjust=-.5) +
            scale_y_continuous(limits=c(0,1),labels = scales::percent) +
            ylab("Percent of Sample") +
            facet_grid(~gender)

我意识到这通常是使用geom_bar(stat="identity", position=position_dodge()) 完成的,但是当我更改stat="identity" 时,会出现以下错误消息:

Error in FUN(X[[i]], ...) : object 'prop' not found

知道如何制作分面图、使用特殊字符(例如 ..prop..)并向 ggplot2 图表添加另一个填充吗?

【问题讨论】:

我认为,如果您在dplyr 中进行数据操作并在ggplot2 中进行绘图,而不是试图依靠@ 中简单的内置数据操作功能,您将会有更好的运气987654329@做复杂的任务。 Gregor,你能解释一下你建议我将 dplyr 用于哪一部分吗? 计算您想要的任何分组级别的比例。 【参考方案1】:

您可以像这样创建必要的四个groups(而不是两个):

StudentData %>% 
  ggplot(., aes(x=degree, group=interaction(gender, category), fill=category)) + 
  geom_bar(aes(y=..prop..), stat="count", position=position_dodge()) +
  geom_text(aes(label=scales::percent(round(..prop..,2)), 
                y=..prop..), stat="count", vjust=-.5, position=position_dodge(.9)) +
  scale_y_continuous(limits=c(0,1),labels = scales::percent) +
  ylab("Percent of Sample") +
  facet_grid(~gender) 

【讨论】:

但是,比例没有意义......它们是如何计算的? @Syrah.Sharpe 显然,每个组的总和为 100%。 @lukeA 我认为他的意思是要有一个图表,所有级别的总和为 100%。 interaction() 无论如何都是多余的,因为 group=category 足以产生该输出 在 ggplot2 版本 3.x.x 中,您使用 stat(prop) 代替 ..prop..

以上是关于ggplot2 使用 ...prop... 和按另一个类别分组条形图的问题的主要内容,如果未能解决你的问题,请参考以下文章

使用 PHP 按另一个数组中的值过滤数组

选择具有最近日期的唯一值,按另一个值分组

单击按钮,移动水龙头,然后按另一个按钮

按另一个数组排序数组?

访问报告:如何按一个字段分组,但按另一个字段排序?

在按另一个变量分组的 r 数据表中排名值