带有2组的ggplot2 Barchart覆盖图

时间:2018-11-26 16:00:03

标签: r ggplot2 graphics bar-chart percentage

我想绘制带有重叠条形图(百分比)的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")

enter image description here

在此示例中,红色和绿色的条形图应相互重叠,而蓝色和紫色的条形图应相互重叠。

我确信必须有一个简单的解决方案,并且发现了以下2个线程:

但是,两个线程所描述的问题略有不同,很遗憾,我无法针对我的具体情况修改代码。

1 个答案:

答案 0 :(得分:1)

您可以事先进行一些重塑。您需要一些逻辑来将红色条(group1b)链接到绿色条(position = "identity"),蓝色条和紫色条也是如此。在这种情况下,通用性是组号。创建组号变量的最简单方法(至少使用已有的数据)只是为除最后一个字符以外的所有子集分组。如果组变得更加复杂,则可以使用正则表达式代替。

然后将geom_col放在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

现在,您可以使用ggplot(data_split, aes(x = interaction(group_num, category), y = values, fill = group)) + geom_col(position = "identity", alpha = 0.4) 将条形图放置在x轴上。一种方法是利用这些组与类别之间的相互作用:

ggplot(data_split, aes(x = group_num, y = values, fill = group)) +
  geom_col(position = "identity", alpha = 0.4) +
  facet_wrap(~ category)

另一种方法是仅将组号放在x轴上,然后按类别进行构面。您可以调整主题元素,使这些构面看起来不太像构面,而更像是x轴上的大组,但是我将其留给其他SO问题提出建议。

geom_col

请注意,geom_bar(stat = "identity")等效于tclsh,并且为了显示重叠,我已经将alpha调低了。

reprex package(v0.2.1)于2018-11-26创建