facet_grid ggplot2 中具有多个分类变量的堆积条形图
Stacked bar chart with multiple categorical variables in ggplot2 with facet_grid
我正在尝试在 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%的 HabitA 值为 1。
我使用 ggplot 和 group_by 制作了这样的图表,只总结了一个属性,但我不确定它如何处理数据中的多个分类属性。
sampledf %>%
group_by(Death, HabitA) %>%
summarise(count=n()) %>%
mutate(perc=count/sum(count))
这只为一个变量生成了我想要的结果,但是当我按参数在组中包含另一个属性时,它 returns 计算所有 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 正在计算每个级别在 [=18= 中出现的总次数]栏目。
ggplot(long, aes(x = variable, fill = variable)) +
geom_bar(stat = "count", position = "dodge") + facet_grid(~ Death)
试试这个,也许不是那么简单,但它确实有效。它包括按照 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)
如果您的问题已得到解答,请确保接受答案以供进一步参考。
---编辑---
已添加剧情
我正在尝试在 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%的 HabitA 值为 1。
我使用 ggplot 和 group_by 制作了这样的图表,只总结了一个属性,但我不确定它如何处理数据中的多个分类属性。
sampledf %>%
group_by(Death, HabitA) %>%
summarise(count=n()) %>%
mutate(perc=count/sum(count))
这只为一个变量生成了我想要的结果,但是当我按参数在组中包含另一个属性时,它 returns 计算所有 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 正在计算每个级别在 [=18= 中出现的总次数]栏目。
ggplot(long, aes(x = variable, fill = variable)) +
geom_bar(stat = "count", position = "dodge") + facet_grid(~ Death)
试试这个,也许不是那么简单,但它确实有效。它包括按照 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)
如果您的问题已得到解答,请确保接受答案以供进一步参考。
---编辑--- 已添加剧情