You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改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())

部分数据如下:

MargesPersoonskenmerkenPeriodenslachtofferssoortkenmerk
WaardeLeeftijd: 15 tot 25 jaar202119.5Online1
WaardeLeeftijd: 25 tot 45 jaar202118.4Online1
WaardeLeeftijd: 45 tot 65 jaar202118Online1
WaardeOnderwijsniveau: 1 Laag202112Online2
WaardeOnderwijsniveau: 2 Middelbaar202117.7Online2
WaardeOnderwijsniveau: 3 Hoog202117.7Online2
WaardeGestandaardiseerd inkomen: 1e 20%-groep202117.7Online2

完整数据集代码:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 00:54:54