如何用R语言设置同尺度双箱线图(含同图实现方法)
如何让箱线图使用相同尺度并整合展示?
我懂你的需求啦——现在你用par(mfrow=c(1,2))把两个箱线图并排,但想要它们Y轴(IQ)用完全一致的尺度,甚至能把两个分组的箱线图放在同一个坐标轴里更方便对比对吧?下面给你两种适配的解决方案:
方案一:基于你正在用的基础R绘图
1. 让并排的两个图统一Y轴尺度
首先先计算所有IQ数据的全局范围,这样两个图的Y轴就用这个固定范围,保证尺度完全一致:
# 先算出所有IQ值的最小和最大值,确定统一Y轴范围 y_global_range <- range(IQ) myCols <- c("#E63946", "#457B9D") # 替换成你实际用的颜色向量 # 设置并排画布 par(mfrow=c(1,2)) # 绘制宫内感染的箱线图,指定ylim用全局范围 plot(age.group[in.utero=="yes"], IQ[in.utero=="yes"], xlab="Age group tested", ylab="IQ", main = "Infected in Utero", col=myCols, ylim = y_global_range) # 绘制感染>5年的箱线图,同样用全局Y轴范围 plot(age.group[in.utero=="no"], IQ[in.utero=="no"], xlab="Age group tested", ylab="IQ", main = "Infected >5 Years", col=myCols, ylim = y_global_range)
2. 把两个分组的箱线图放到同一个坐标轴里
如果想直接在同一图里对比不同感染状态的IQ,基础R可以用boxplot的公式语法,自动统一尺度:
# 先创建一个合并的感染分组变量 data$infection_status <- ifelse(data$in.utero == "yes", "In Utero", "Infected >5 Years") # 绘制同一图中的分组箱线图 boxplot(IQ ~ age.group + infection_status, data = data, xlab="Age Group & Infection Status", ylab="IQ", col=rep(myCols, each=length(unique(data$age.group))), # 给同年龄组的不同感染状态分配颜色 main="IQ Distribution by Age and Infection Status")
方案二:用ggplot2实现(更简洁直观)
ggplot2天生擅长这种分组可视化,代码更清晰,而且自动帮你统一所有图形的尺度:
library(ggplot2) ggplot(data, aes(x=age.group, y=IQ, fill=infection_status)) + geom_boxplot(position=position_dodge(width=0.8)) + # 让同一年龄组的两个箱线并排 labs(x="Age group tested", y="IQ", title="IQ by Age Group and Infection Status") + scale_fill_manual(values=myCols) + # 自定义颜色 theme_bw() # 用简洁的主题
这样的图里,所有箱线都在同一坐标轴下,Y轴尺度完全统一,还能直接对比同一年龄组内不同感染状态的IQ差异,对比起来更直观。
内容的提问来源于stack exchange,提问作者Shany
相关产品推荐
相关产品推荐

