ggplot2:将X轴离散值分组为子组

15

我想使用ggplot2创建一个条形图,其中x轴的离散值将被分组为子组(请参见附加的图片 - 图片来自网络,我还没有绘制该图的代码)。

输入图像说明

谢谢您的帮助!


1
你尝试过按组使用 facet_wrap 吗? - Gary Weissman
1
从我所了解的facet_wrap,它会将图形分成n列/行... - lqdo2000
1
你可以随时使用 facet_grid 来控制分面布局。 - Gary Weissman
感谢 facet_grid - lqdo2000
2个回答

19

两种方法:

示例数据:

dat <- data.frame(value=runif(26)*10,
                  grouping=c(rep("Group 1",10),
                             rep("Group 2",10),
                             rep("Group 3",6)),
                  letters=LETTERS[1:26])

head(dat)
     value grouping letters
1 8.316451  Group 1       A
2 9.768578  Group 1       B
3 4.896294  Group 1       C
4 2.004545  Group 1       D
5 4.905058  Group 1       E
6 8.997713  Group 1       F

不使用分面:

ggplot(dat, aes(grouping, value, fill=letters, label = letters)) + 
     geom_bar(position="dodge", stat="identity") + 
     geom_text(position = position_dodge(width = 1), aes(x=grouping, y=0))

使用分面:

ggplot(dat, aes(letters,value, label = letters)) + 
     geom_bar(stat="identity") + 
     facet_wrap(~grouping, scales="free")

分面具有明显的优势,不必纠结于标签的位置。


谢谢!使用分面效果非常好。不过,是否可以使所有条形的宽度独立于每个组中数值的数量而相同?(使用scales="free_x"时,组的宽度相同但是条形的宽度不同。当使用scales="free_y"时则相反)。 - lqdo2000
4
找到了。我使用了 facet_grid 函数,并加上参数 'space="free_x"'! - lqdo2000
3
如何在y轴上处理离散的、非数值型的值? - Katie S

8

除此之外,还有ggh4x::guide_axis_nested()这个替代方案,它解决了类似的问题。免责声明:我是ggh4x的作者。

library(ggplot2)

df <- data.frame(
  x = LETTERS[1:16],
  group = rep(c("Group 1", "Group 2", "Group 3"), c(5, 3, 8)),
  value = rpois(16, 10)
)

ggplot(df, aes(paste0(x, "&", group), value)) +
  geom_col() +
  guides(x = ggh4x::guide_axis_nested(delim = "&"))

reprex package (v2.0.0) 创建于2023年2月24日


如果我使用您的确切示例但设置x = LETTERS [1:2],我会得到意外的集群行为。 我希望它看起来与您上面的内容完全相同,但每个组仅具有字母A和B。 不幸的是,当我这样做时,它不再按“组”分组,而是跨A和B分组。 有什么办法可以解决这个问题吗? - Nathan
你可以使用 factor(paste(...), levels = ...) 来设置你想要的顺序的水平。 - teunbrand
我将创建一个新的帖子 :) 仍然有困难使其看起来像上面的那样,“Group”仍然不像您上面所示的那样视觉上看起来。 - Nathan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接