如何在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
相关产品推荐
相关产品推荐

