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

如何在ggplot2中绘制类似分组柱状图样式的多X轴折线图

问题解决:绘制分组柱状图样式的多X轴折线图

数据准备

df <- structure(list(A = c(25, 25, 25, 50, 50, 50, 100, 100, 100, 250, 250, 250),
                     R = c("R1", "R2", "R3", "R1", "R2", "R3", "R1", "R2", "R3", "R1", "R2", "R3"), 
                     ACI = c(2.75769,
                             3.59868,
                             3.00425,
                             1.90415,
                             2.19912,
                             2.01439,
                             1.34013,
                             1.45594,
                             1.3738,
                             0.84241,
                             0.87391,
                             0.85184
                     ), 
                     PB = c(3.06259,
                            4.10288,
                            3.40414,
                            2.00337,
                            2.32796,
                            2.13138,
                            1.37404,
                            1.49467,
                            1.40867,
                            0.84817,
                            0.88002,
                            0.85838
                     ), 
                     NB = c(3.13425,
                            4.22754,
                            3.49041,
                            2.03281,
                            2.36812,
                            2.16289,
                            1.3858,
                            1.5086,
                            1.42187,
                            0.85346,
                            0.88572,
                            0.86346
                     ), 
                     Bca = c(2.65087,
                             3.3918,
                             2.86767,
                             1.89719,
                             2.20208,
                             2.00181,
                             1.35534,
                             1.49656,
                             1.38895,
                             0.85497,
                             0.9015,
                             0.86487
                     ), 
                     SB = c(3.33211,
                            4.42798,
                            3.73011,
                            2.12197,
                            2.48144,
                            2.266,
                            1.41635,
                            1.54522,
                            1.45326,
                            0.85775,
                            0.89055,
                            0.86863
                    ), 
                     `round(2)` = c(2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2)),
                     class = "data.frame", row.names = c(NA, -12L))

需求说明

需要绘制类似分组柱状图结构的多X轴折线图:以A的4个取值(25、50、100、250)作为大分组横向排列,每个大分组下包含R1/R2/R3三个小分组;每个小分组内,ACI/PB/NB/Bca/SB这5个指标的数值对应一条折线,整体呈现“大分组-小分组-多折线”的层级结构。

当前问题

原代码通过facet_wrap拆分A,但仅用geom_line()导致折线在R的类别间错误连接,且缺少点标记区分数值,整体样式与预期不符:

df %>% 
  pivot_longer(ACI:SB) %>% 
  mutate(across(where(is.character), as.factor)) %>% 
  ggplot(aes(x = R, y = value, group=name)) +
  geom_line()+
  facet_wrap(~A, nrow=1, strip.position="bottom")

解决方案

调整可视化逻辑,通过颜色区分指标、添加点标记、优化分面样式实现预期效果:

library(tidyverse)

df %>% 
  # 宽表转长表,提取指标列转为name-value对
  pivot_longer(cols = ACI:SB, names_to = "Indicator", values_to = "Value") %>% 
  # 显式指定因子顺序,保证分类展示逻辑符合预期
  mutate(
    A = factor(A, levels = c(25, 50, 100, 250)),
    R = factor(R, levels = c("R1", "R2", "R3")),
    Indicator = factor(Indicator, levels = c("ACI", "PB", "NB", "Bca", "SB"))
  ) %>% 
  ggplot(aes(x = R, y = Value, group = Indicator, color = Indicator)) +
  # 同时添加折线和点标记,兼顾趋势展示与数值辨识度
  geom_line(linewidth = 1) +
  geom_point(size = 2.5) +
  # 按A横向分面,将大分组标签放在x轴上方,取消分面间空白
  facet_wrap(~A, nrow = 1, strip.position = "bottom") +
  # 优化主题样式,提升整体可读性
  theme_minimal() +
  theme(
    panel.spacing = unit(0, "lines"),
    strip.background = element_blank(),
    strip.placement = "outside",
    axis.title.x = element_blank(),
    legend.title = element_text(size = 12),
    legend.position = "bottom"
  ) +
  # 设置坐标轴和图例标签
  labs(y = "数值", color = "指标")

代码说明

  • 数据整理:转长表后显式指定因子顺序,避免分类顺序混乱。
  • 可视化元素:geom_line展示趋势,geom_point强化数值点的辨识度。
  • 分面优化:取消分面间空白,让大分组更紧凑;将分面标签放在x轴上方,模拟分组柱状图的层级结构。
  • 主题调整:简化背景样式,优化图例位置与标签,提升图表可读性。

内容的提问来源于stack exchange,提问作者Ahmet-Salman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 06:01:08