带有 facet_grid 的 ggplot2 中具有多个分类变量的堆积条形图

Posted

技术标签:

【中文标题】带有 facet_grid 的 ggplot2 中具有多个分类变量的堆积条形图【英文标题】:Stacked bar chart with multiple categorical variables in ggplot2 with facet_grid 【发布时间】:2018-01-07 14:40:08 【问题描述】:

我正在尝试在 ggplot2 中创建一个堆积条形图,以显示对应于每个分类变量的值的百分比。这是我正在尝试使用的数据示例。

sampledf <- data.frame("Death" = rep(0:1, each = 5), 
                   "HabitA" = rep(0:1, c(3, 7)),
                   "HabitB" = rep(1:2, c(4, 6)),
                   "HabitC" = rep(0:1, c(6, 4)))

每个习惯都是我用来创建堆积条形图的列,我想使用 facet_grid 中的 Death 列。我希望在条形图中显示每个习惯的值的百分比。

我认为创建图表所需的输出数据应转换为,在 Death = 0 下,HabitA 有 60% 0 的值,40% 的值为 1,而在 Death = 1 下,HabitA 的 100%值为 1。

我使用 ggplot 和 group_by 制作了这样的图表,仅针对一个属性进行汇总,但我不确定这如何处理数据中的多个分类属性。

sampledf %>% 
  group_by(Death, HabitA) %>% 
  summarise(count=n()) %>% 
  mutate(perc=count/sum(count))

这会产生我想要的一个变量,但是当我在 group by 参数中包含另一个属性时,它会返回所有 3 个属性组合的百分比,这不是我想要的。我尝试使用 summarise_at/mutate_at 但它似乎不起作用。

sampledf %>% 
  group_by(Death) %>% 
  mutate_at(c("HabitA", "HabitB"), Counts = n())

在 R 中是否有一种直接的方法可以做到这一点,并将结果数据用作 ggplot2 的输入?

编辑:

我试图重塑数据并使用长表格来构建我的情节。这就是我所拥有的。

long <- melt(sampledf, id.vars = c("Death"))

结果数据就是这种格式。

  Death variable value
1     0   HabitA     0
2     0   HabitA     0
3     0   HabitA     0
4     0   HabitA     1
5     0   HabitA     1
6     1   HabitA     1
7     1   HabitA     1

我不确定如何使用value 属性来构建绘图,因为我目前正在尝试构建的ggplot 正在计算variable 列中每个级别出现的总次数。

ggplot(long, aes(x = variable, fill = variable)) +
  geom_bar(stat = "count", position = "dodge") + facet_grid(~ Death)

【问题讨论】:

您可以考虑在汇总和绘图之前将数据集重新整形为长格式。有关如何执行此操作的一些选项,请参阅here。 【参考方案1】:

试试这个,也许不是那么简单,但它确实有效。它包括gather 建议的@aosmith 重塑。然后计算分组后的观察次数,然后计算每组Death + habitat 的百分比。然后汇总得到唯一值。

sampledf_edited <- sampledf %>% 
  tidyr::gather("habitat", "count", 2:4) %>% 
  group_by(Death, habitat, count) %>% 
  mutate(observation = n()) %>% 
  ungroup() %>% 
  group_by(Death, habitat) %>% 
  mutate(percent = observation/n()) %>% 
  ungroup() %>% 
  group_by(Death, habitat, count, percent) %>%
  summarize()

需要count因子。

sampledf_edited$count <- as.factor(sampledf_edited$count)

ggplot 绘制。

ggplot(sampledf_edited, aes(habitat, percent, fill = count)) +  
geom_bar(stat = "identity") + 
facet_grid(~ Death)

如果您的问题已得到解答,请确保接受答案以供进一步参考。

---编辑--- 增加情节

【讨论】:

太棒了,这完美!有没有办法将条形组合在一起而不是堆叠在一起? position = "dodge" 添加到geom_bar 函数。然而,这些条不具有相同的宽度。检查this answer 进行修复。

以上是关于带有 facet_grid 的 ggplot2 中具有多个分类变量的堆积条形图的主要内容,如果未能解决你的问题,请参考以下文章

带有facet_grid的ggplot2中带有多个分类变量的堆积条形图

R:ggplot2:facet_grid:如何在少数(不是全部)标签中包含数学表达式?

ggplot2:从图中删除未使用的因子水平组合的方面(facet_grid)

在 ggplot2 facet_grid 中旋转切换的构面标签

R语言ggplot2可视化绘制带有双y轴(double y axis)的分面图(facetfacet_grid)

ggplot2,facet_grid 的 x 轴问题