带百分比的分面条形图

Posted

技术标签:

【中文标题】带百分比的分面条形图【英文标题】:Facetted Barchart with percentages 【发布时间】:2022-01-15 13:04:40 【问题描述】:

我有一个名为 charities 的数据集,其中包含两种治疗 (csr)、两种性别 (gender) 和受试者的表现 (pointspr)。我想制作一个直方图,在 y 轴上显示百分比,在 x 轴上显示性能,并按治疗和性别进行分面包装。我提供了一个最小的数据示例。

此代码按治疗和性别生成直方图,但百分比不正确。我在其他地方看到过使用 ..group.. 作为一个二维变量,但我有两个:csr 和 gender。

csr=0 和性别=1 的图表对于 pointspr=10 应该有 66.7%,但使用此代码生成的图表的百分比约为 15%。感谢您的帮助。

library(ggplot)
charities <- csr=c(0,0,0,0,0,0,1,1,1,1,1,1), 
gender=c(1,1,1,2,2,2,1,1,1,2,2,2), 
pointspr=c(10,5,10,15,12,12,2,2,5,1,1,4) 
 ggplot(charities, aes(x = factor(pointspr))) +  
  geom_bar(binwidth=1, aes(y = (..count..)/sum(..count..)), fill = 'lightblue') +
  scale_y_continuous(labels=percent) +
  facet_wrap(csr ~ gender) +
  labs(x = 'Number of correct answers under piece rate incentive', y = 'Percentage') +
  theme_minimal()

【问题讨论】:

【参考方案1】:

与其在ggplot 代码中即时计算百分比,不如将聚合数据集传递给ggplot。

编辑要标记数字变量,一种选择是将它们转换为标记因子。

library(ggplot2)
library(dplyr)

charities <- data.frame(
  csr = c(0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1),
  gender = c(1, 1, 1, 2, 2, 2, 1, 1, 1, 2, 2, 2),
  pointspr = c(10, 5, 10, 15, 12, 12, 2, 2, 5, 1, 1, 4)
)

charities <- charities %>%
  mutate(csr = factor(csr, levels = 0:1, labels = c("NSI", "SI")),
         gender = factor(gender, levels = 1:2, labels = c("Men", "Women"))) %>%
  count(csr, gender, pointspr = factor(pointspr)) %>%
  group_by(csr, gender) %>%
  mutate(pct = n / sum(n)) %>%
  ungroup()

ggplot(charities, aes(pointspr, pct)) +
  geom_col(fill = "lightblue") +
  scale_y_continuous(labels = scales::percent) +
  facet_wrap(csr ~ gender) +
  labs(x = "Number of correct answers under piece rate incentive", y = "Percentage") +
  theme_minimal()

正如@RohanShinde 所提到的,第二个选项是通过facet_wrap 中的labeller 参数设置标签,而不是重新编码为标记因子,如下所示:

facet_wrap(csr ~ gender, 
           labeller = labeller(csr = c("0" = "NSI", "1" = "SI"),
                               gender = c("1" = "Men", "2" = "Women")))

【讨论】:

非常感谢,斯特凡!!!我非常感谢您快速而有帮助的回复。 :) 知道如何将图例名称从数字更改为文本吗?所以 0="NSI" 和 1="SI" 代表 csr 和 1="Men" 和 2=Women 代表性别? @Mary Rigdon 您可以尝试在facet_wrap() 中使用labeller() 参数 @MaryRigdon 我刚刚进行了编辑,向您展示了两个选项来标记您的因素。 斯特凡,非常感谢!!!!感谢您的所有帮助。我现在可以完成我正在写的论文了。 :)

以上是关于带百分比的分面条形图的主要内容,如果未能解决你的问题,请参考以下文章

python中怎样画条形图

excel柱形图上如何显示百分比和数值

柱状图怎么显示数据和百分比

r语言 条形图上有数值

柱状图怎么显示数据和百分比

excel柱状图标既显示数量也显示占比 怎样设置啊