R语言中实现分组箱线图的最简方案求助
R语言中实现分组箱线图的最简方案求助
我最近在做一个很简单的分组箱线图时遇到了麻烦,我的原始数据是这样的:
# 原始数据 data <- data.frame( Wörter = c(0.15, 0.10, 0.05, 0.55, 0.00, 0.20, 0.15, 0.35, 0.35, 0.40, 0.55, 0.65, 0.60, 0.50), Sätze = c(0.24, 0.15, 0.18, 0.60, 0.06, 0.65, 0.31, 0.87, 0.75, 0.78, 0.95, 0.96, 0.90, 0.95), Text = c(0.34, 0.08, 0.16, 0.44, 0.26, 0.68, 0.47, 0.69, 0.76, 0.59, 0.76, 0.83, 0.77, 0.82), row.names = c(paste0("P.0", 1:9), paste0("N.0", 1:5)) )
直接执行boxplot(data)时,能得到三个变量各自的箱线图,差不多是我想要的样子,但我希望每个变量都能分成两组——一组是行名以P开头的观测,另一组是以N开头的,这样总共六个箱线图,最好还能给两组加上颜色区分。
于是我给数据加了一个分组变量:
data$Gruppe <- c(rep("P",9), rep("N",5))
现在数据里有了非数值的分组变量,再直接用boxplot(data)就不行了,想问问有没有什么最小改动的方法能实现我想要的效果?我之前看到过一些分组箱线图的解决方案,但那些案例的数据结构和我的不太一样,希望能针对我的数据来给个简单办法,谢谢啦!
方案一:Base R 最简实现
你可以先把宽格式的数据转成长格式,这是解决这类分组绘图问题的关键。用reshape2包的melt函数就很方便:
- 先安装并加载包(如果没装过的话):
install.packages("reshape2") library(reshape2)
- 转换数据格式:
data_long <- melt(data, id.vars = "Gruppe")
- 用公式语法绘制分组箱线图,还能自定义颜色:
boxplot(value ~ variable + Gruppe, data = data_long, col = c("lightblue", "lightcoral"), xlab = "变量与分组", ylab = "数值") # 添加图例区分两组 legend("topright", legend = c("P组", "N组"), fill = c("lightblue", "lightcoral"))
这个方法只需要简单转换数据格式,就能用你熟悉的boxplot函数实现需求,改动很小。
方案二:ggplot2 更美观的实现
如果想要更美观、后续调整更灵活的图,ggplot2是更好的选择,代码也很简洁:
- 安装并加载包:
install.packages("ggplot2") library(ggplot2)
- 直接用转换后的长格式数据绘图:
ggplot(data_long, aes(x = variable, y = value, fill = Gruppe)) + geom_boxplot(position = position_dodge(width = 0.75)) + # 让分组箱线图并排显示 scale_fill_manual(values = c("P" = "lightblue", "N" = "lightcoral")) + # 自定义颜色 labs(x = "变量", y = "数值", fill = "分组") + theme_minimal()
这里position_dodge参数能避免同一变量下的两个箱线图重叠,颜色和标签也可以根据需求随意调整。
备注:内容来源于stack exchange,提问作者Sebastian




