在R中用ggplot2绘制多问题双组箱线图及布局调整
用ggplot2绘制多问题双组箱线图并调整布局
嗨,刚好我经常处理这类可视化需求,这就一步步教你搞定!
首先,数据格式是关键——ggplot2最适合处理「长格式」数据,而你现在的数据集应该是宽格式(每个问题一列,每组对应一列)。咱们先把数据转成tidy格式,用tidyr::pivot_longer就能轻松搞定。
第一步:准备/转换数据
先模拟一个和你情况匹配的数据集(你可以直接替换成自己的数据):
library(tidyverse) # 模拟数据:4个问题,每组20个受访者得分 set.seed(123) df <- tibble( id = 1:20, # 问题1的两组得分 q1_groupA = rnorm(20, 5, 1), q1_groupB = rnorm(20, 6, 1), # 问题2的两组得分 q2_groupA = rnorm(20, 4.5, 1.2), q2_groupB = rnorm(20, 5.5, 1.2), # 问题3的两组得分 q3_groupA = rnorm(20, 6, 0.8), q3_groupB = rnorm(20, 5, 0.8), # 问题4的两组得分 q4_groupA = rnorm(20, 5.2, 1), q4_groupB = rnorm(20, 5.8, 1) ) # 转成长格式 df_long <- df %>% pivot_longer( cols = -id, names_to = c("question", "group"), names_sep = "_" # 按下划线拆分列名,得到问题和分组 )
第二步:绘制基础多问题箱线图
现在用ggplot2画所有问题的双组箱线图,核心是把question作为分面依据,group作为填充/分组变量:
base_plot <- ggplot(df_long, aes(x = group, y = value, fill = group)) + geom_boxplot(width = 0.6, alpha = 0.7) + # 调整箱线图宽度和透明度 labs( title = "各问题两组受访者得分对比", x = "分组", y = "得分", fill = "分组" ) + theme_minimal() + scale_fill_brewer(palette = "Set2") # 用好看的配色方案
第三步:调整布局(一行/两行)
这一步就靠facet_wrap来控制排列了,非常灵活:
1. 所有箱线图排成一行
只需要设置nrow = 1:
# 一行布局 base_plot + facet_wrap(~question, nrow = 1) + theme(strip.text = element_text(size = 12, face = "bold")) # 加粗问题标签
2. 排成两行(比如4个问题分成2行2列)
设置nrow = 2或者ncol = 2都可以:
# 两行布局 base_plot + facet_wrap(~question, nrow = 2) + theme(strip.text = element_text(size = 12, face = "bold"))
如果是5个问题,想排成2行(3个+2个),直接用nrow = 2就行,ggplot会自动帮你分配数量;要是想强制每行固定数量,用ncol = 3就能得到2行(3个+2个)的布局。
额外小技巧
- 要是想让每个分面的y轴范围一致,加
scales = "fixed"到facet_wrap里;如果每个问题得分范围差异大,用scales = "free_y"让y轴自适应。 - 可以用
geom_jitter()在箱线图上叠加散点,展示原始数据分布:
base_plot + geom_jitter(width = 0.2, alpha = 0.5) + # 散点偏移避免重叠 facet_wrap(~question, nrow = 2)
这样你就能轻松画出符合需求的单图布局,还能按需调整排列方式啦!
内容的提问来源于stack exchange,提问作者user567879
相关产品推荐
相关产品推荐

