如何修改ggplot2中facet_wrap的多图表标题与布局?
ggplot2分面图表标签优化方案
问题背景
我用以下代码通过facet_wrap()生成了6个图表:
library(ggplot2) p <- ggplot(data = kenmerken_ot, aes(x = Persoonskenmerken, y = slachtoffers, fill = kenmerk)) p + geom_col(position = "dodge") + facet_wrap(~ soort + kenmerk) + labs(x = NULL, y = "Slachtoffers in %", fill = "Test") + guides(fill = FALSE) + theme(axis.text.x = element_blank())
部分数据如下:
| Marges | Persoonskenmerken | Perioden | slachtoffers | soort | kenmerk |
|---|---|---|---|---|---|
| Waarde | Leeftijd: 15 tot 25 jaar | 2021 | 19.5 | Online | 1 |
| Waarde | Leeftijd: 25 tot 45 jaar | 2021 | 18.4 | Online | 1 |
| Waarde | Leeftijd: 45 tot 65 jaar | 2021 | 18 | Online | 1 |
| Waarde | Onderwijsniveau: 1 Laag | 2021 | 12 | Online | 2 |
| Waarde | Onderwijsniveau: 2 Middelbaar | 2021 | 17.7 | Online | 2 |
| Waarde | Onderwijsniveau: 3 Hoog | 2021 | 17.7 | Online | 2 |
| Waarde | Gestandaardiseerd inkomen: 1e 20%-groep | 2021 | 17.7 | Online | 2 |
完整数据集代码:
kenmerken_ot <- tibble::tribble( ~Marges, ~Persoonskenmerken, ~Perioden, ~slachtoffers, ~soort, ~kenmerk, "Waarde", "Leeftijd: 15 tot 25 jaar", 2021, 19.5, "Online", 1, "Waarde", "Leeftijd: 25 tot 45 jaar", 2021, 18.4, "Online", 1, "Waarde", "Leeftijd: 45 tot 65 jaar", 2021, 18, "Online", 1, "Waarde", "Leeftijd: 65 jaar of ouder", 2021, 12, "Online", 1, "Waarde", "Onderwijsniveau: 1 Laag", 2021, 15.4, "Online", 2, "Waarde", "Onderwijsniveau: 2 Middelbaar", 2021, 17.7, "Online", 2, "Waarde", "Onderwijsniveau: 3 Hoog", 2021, 17.7, "Online", 2, "Waarde", "Gestandaardiseerd inkomen: 1e 20%-groep", 2021, 17.7, "Online", 3, "Waarde", "Gestandaardiseerd inkomen: 2e 20%-groep", 2021, 15.6, "Online", 3, "Waarde", "Gestandaardiseerd inkomen: 3e 20%-groep", 2021, 16.9, "Online", 3, "Waarde", "Gestandaardiseerd inkomen: 4e 20%-groep", 2021, 17.1, "Online", 3, "Waarde", "Gestandaardiseerd inkomen: 5e 20%-groep", 2021, 17.3, "Online", 3, "Waarde", "Leeftijd: 15 tot 25 jaar", 2021, 23.7, "Traditioneel", 1, "Waarde", "Leeftijd: 25 tot 45 jaar", 2021, 20.8, "Traditioneel", 1, "Waarde", "Leeftijd: 45 tot 65 jaar", 2021, 16.1, "Traditioneel", 1, "Waarde", "Leeftijd: 65 jaar of ouder", 2021, 9.8, "Traditioneel", 1, "Waarde", "Onderwijsniveau: 1 Laag", 2021, 15.2, "Traditioneel", 2, "Waarde", "Onderwijsniveau: 2 Middelbaar", 2021, 16.7, "Traditioneel", 2, "Waarde", "Onderwijsniveau: 3 Hoog", 2021, 19, "Traditioneel", 2, "Waarde", "Gestandaardiseerd inkomen: 1e 20%-groep", 2021, 22.6, "Traditioneel", 3, "Waarde", "Gestandaardiseerd inkomen: 2e 20%-groep", 2021, 16.4, "Traditioneel", 3, "Waarde", "Gestandaardiseerd inkomen: 3e 20%-groep", 2021, 15.6, "Traditioneel", 3, "Waarde", "Gestandaardiseerd inkomen: 4e 20%-groep", 2021, 15.7, "Traditioneel", 3, "Waarde", "Gestandaardiseerd inkomen: 5e 20%-groep", 2021, 17.1, "Traditioneel", 3, )
当前图表效果:
需求
- 移除分面中的"Online"和"Traditioneel"标签,将其横向放置在图表右侧;
- 将
kenmerk的1、2、3标签替换为“年龄”“教育”“收入”; - 分类标签仅显示一次,不要在每个图表上重复出现。
解决方案
步骤1:数据预处理
先对数据进行标签替换和格式调整,把kenmerk转为带中文标签的因子:
library(dplyr) library(ggplot2) kenmerken_ot <- kenmerken_ot %>% mutate( # 替换kenmerk为中文标签 kenmerk = factor(kenmerk, levels = c(1,2,3), labels = c("年龄", "教育", "收入")), # 将soort转为带中文标签的因子 soort = factor(soort, levels = c("Online", "Traditioneel"), labels = c("线上", "传统")) )
步骤2:修改ggplot代码,使用facet_grid替代facet_wrap
用facet_grid可以更灵活地控制标签布局,实现需求中的显示效果:
ggplot(data = kenmerken_ot, aes(x = Persoonskenmerken, y = slachtoffers, fill = kenmerk)) + geom_col(position = "dodge") + # 行设置为kenmerk(仅显示一次),列设置为soort(横向在右侧) facet_grid(kenmerk ~ soort, scales = "free_x", switch = "y") + labs(x = NULL, y = "受害者比例(%)", fill = "特征") + guides(fill = FALSE) + theme( # 保持原需求:隐藏x轴文本 axis.text.x = element_blank(), # 调整行标签到左侧并横向显示 strip.text.y.left = element_text(angle = 0), # 列标签横向显示,且放在图表外侧 strip.text.x = element_text(angle = 0), strip.placement = "outside" )
效果说明
facet_grid(kenmerk ~ soort)将"年龄"/"教育"/"收入"作为行标签,仅在左侧显示一次;switch = "y"让行标签从分面顶部移到左侧,避免重复;- 列标签"线上"/"传统"横向显示在图表顶部右侧,满足布局需求;
- 数据预处理完成了标签的中文替换,符合显示要求。
内容的提问来源于stack exchange,提问作者Nasher
相关产品推荐
相关产品推荐

