叠加的ggplot2条形图,带2组 [英] Overlayed ggplot2 Barchart with 2 Groups

查看:0
本文介绍了叠加的ggplot2条形图,带2组的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想绘制一个带有重叠条形图(百分比)的ggplot2条形图。我有两个组,每个组由两个子组组成。

考虑以下可重现的示例:

# 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")

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

我相信一定有一个简单的解决方案,我找到了以下两个主题:

但是,这两个线程描述的问题略有不同,不幸的是,我无法针对我的特定情况修改代码。

推荐答案

您可以通过事先进行一些重塑来完成此操作。您需要一些逻辑来将红色条(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调低了。

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

这篇关于叠加的ggplot2条形图,带2组的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆