带有 2 个组的叠加 ggplot2 条形图
Overlayed ggplot2 Barchart with 2 Groups
我想绘制带有重叠条(百分比)的 ggplot2 条形图。我有 2 个组,每个组由 2 个子组组成。
考虑以下可重现的示例:
# Create data for ggplot
data_ggp <- data.frame(category = rep(c("cat1", "cat2", "cat3"), 4),
values = c(0.664, 0.045, 0.291, 0.482, 0.029, 0.489, 0.537, 0.027, 0.436, 0.536, 0.028, 0.436),
group = c(rep("group1a", 3), rep("group1b", 3), rep("group2a", 3), rep("group2b", 3)))
这是我目前得到的:
library("ggplot2")
# Draw barchart (not overlayed)
ggplot(data_ggp, aes(category, values)) +
geom_bar(stat = "identity", aes(fill = group), position = "dodge")
在此示例中,红色和绿色条应相互重叠,蓝色和紫色条应相互重叠。
我相信一定有一个简单的解决方案,我发现了以下 2 个线程:
然而,这两个线程描述的问题略有不同,不幸的是我无法根据我的具体情况修改代码。
您可以事先稍微整形一下。您需要一些逻辑来 link 红色条 (group1a
) 到绿色条 (group1b
),蓝色和紫色条也是如此。在这种情况下,共同点是组号。创建组号变量的最简单方法(至少使用您拥有的数据)只是对除最后一个字符以外的所有字符进行子集化。如果组变得更复杂,您可以改用正则表达式。
然后在 geom_col
中放置 position = "identity"
,无论它们是否会相互重叠,您都可以放置它们。
library(tidyverse)
data_split <- data_ggp %>%
mutate(group_num = str_sub(group, 1, -2))
head(data_split)
#> category values group group_num
#> 1 cat1 0.664 group1a group1
#> 2 cat2 0.045 group1a group1
#> 3 cat3 0.291 group1a group1
#> 4 cat1 0.482 group1b group1
#> 5 cat2 0.029 group1b group1
#> 6 cat3 0.489 group1b group1
现在您可以使用 group_num
在 x 轴上放置条形图。一种方法是使用这些组与类别之间的交互:
ggplot(data_split, aes(x = interaction(group_num, category), y = values, fill = group)) +
geom_col(position = "identity", alpha = 0.4)
另一种方法是仅将组编号放在 x 轴上,然后按类别分面。您可以调整主题元素,使分面看起来不像分面,而更像 x 轴上的大组,但我会把它留给其他 SO 问题的建议。
ggplot(data_split, aes(x = group_num, y = values, fill = group)) +
geom_col(position = "identity", alpha = 0.4) +
facet_wrap(~ category)
请注意,geom_col
等同于 geom_bar(stat = "identity")
,为了显示重叠,我将 alpha 调低了。
由 reprex package (v0.2.1)
创建于 2018-11-26
我想绘制带有重叠条(百分比)的 ggplot2 条形图。我有 2 个组,每个组由 2 个子组组成。
考虑以下可重现的示例:
# Create data for ggplot
data_ggp <- data.frame(category = rep(c("cat1", "cat2", "cat3"), 4),
values = c(0.664, 0.045, 0.291, 0.482, 0.029, 0.489, 0.537, 0.027, 0.436, 0.536, 0.028, 0.436),
group = c(rep("group1a", 3), rep("group1b", 3), rep("group2a", 3), rep("group2b", 3)))
这是我目前得到的:
library("ggplot2")
# Draw barchart (not overlayed)
ggplot(data_ggp, aes(category, values)) +
geom_bar(stat = "identity", aes(fill = group), position = "dodge")
在此示例中,红色和绿色条应相互重叠,蓝色和紫色条应相互重叠。
我相信一定有一个简单的解决方案,我发现了以下 2 个线程:
然而,这两个线程描述的问题略有不同,不幸的是我无法根据我的具体情况修改代码。
您可以事先稍微整形一下。您需要一些逻辑来 link 红色条 (group1a
) 到绿色条 (group1b
),蓝色和紫色条也是如此。在这种情况下,共同点是组号。创建组号变量的最简单方法(至少使用您拥有的数据)只是对除最后一个字符以外的所有字符进行子集化。如果组变得更复杂,您可以改用正则表达式。
然后在 geom_col
中放置 position = "identity"
,无论它们是否会相互重叠,您都可以放置它们。
library(tidyverse)
data_split <- data_ggp %>%
mutate(group_num = str_sub(group, 1, -2))
head(data_split)
#> category values group group_num
#> 1 cat1 0.664 group1a group1
#> 2 cat2 0.045 group1a group1
#> 3 cat3 0.291 group1a group1
#> 4 cat1 0.482 group1b group1
#> 5 cat2 0.029 group1b group1
#> 6 cat3 0.489 group1b group1
现在您可以使用 group_num
在 x 轴上放置条形图。一种方法是使用这些组与类别之间的交互:
ggplot(data_split, aes(x = interaction(group_num, category), y = values, fill = group)) +
geom_col(position = "identity", alpha = 0.4)
另一种方法是仅将组编号放在 x 轴上,然后按类别分面。您可以调整主题元素,使分面看起来不像分面,而更像 x 轴上的大组,但我会把它留给其他 SO 问题的建议。
ggplot(data_split, aes(x = group_num, y = values, fill = group)) +
geom_col(position = "identity", alpha = 0.4) +
facet_wrap(~ category)
请注意,geom_col
等同于 geom_bar(stat = "identity")
,为了显示重叠,我将 alpha 调低了。
由 reprex package (v0.2.1)
创建于 2018-11-26