如何绘制按连续变量与因子变量分组且x轴间距匹配数值的boxplot?
解决方案
问题根源是将连续变量I转为因子后,x轴变为离散型,导致每个分组的间距被强制均等。要保留实际数值间距,同时实现分组箱线图,可按以下方式修改:
方法1:保留I的连续数值型属性(推荐)
这种方式直接利用连续x轴的特性,通过position_dodge让同一I值下的不同Method箱线图并排显示:
- 创建数据框时,不要将
I转为因子,保持其数值型:
df5 <- data.frame( I = rep(c(50, 100, 200, 400), each = dim(df1)[1]), rbind(df1, df2, df3, df4) )
- 绘图时,使用
position_dodge设置箱线图的并排宽度,同时指定x轴仅显示目标刻度:
ggplot(df5, aes(x = I, y = Values*1e05, fill = Method)) + geom_boxplot(position = position_dodge(width = 20)) + # width可根据需求调整,避免箱线图重叠 scale_fill_manual(values = c("#E41A1C", "#377EB8", "#4DAF4A", "#FF7F00")) + scale_x_continuous(breaks = c(50, 100, 200, 400)) + # 仅显示指定的I值刻度 labs(x = "I (Number of subjects)", y = expression(paste("MISE(", beta[1], "(s))(x", 10^-5, ")"))) + theme_minimal()
position_dodge的width参数可根据I的数值范围调整,比如当前I的间隔是50、100,设为20既能保证同一I值下的箱线图不重叠,又能保留连续轴的间距比例。
方法2:使用因子型I并自定义x轴间距(较繁琐)
如果必须保留I的因子类型,可通过ggh4x扩展包实现自定义离散轴间距:
- 安装并加载
ggh4x:
install.packages("ggh4x") library(ggh4x)
- 绘图时设置自定义轴截断范围:
ggplot(df5, aes(x = I, y = Values*1e05, fill = Method)) + geom_boxplot(position = position_dodge()) + scale_fill_manual(values = c("#E41A1C", "#377EB8", "#4DAF4A", "#FF7F00")) + scale_x_discrete(limits = factor(c(50, 100, 200, 400))) + guides(x = guide_axis_truncated(trunc_lower = c(0,50,100,200), trunc_upper = c(100,200,400,500))) + labs(x = "I (Number of subjects)", y = expression(paste("MISE(", beta[1], "(s))(x", 10^-5, ")"))) + theme_minimal()
这种方法需要手动计算每个因子水平的截断范围,不如方法1直观高效。
内容的提问来源于stack exchange,提问作者WuyaoKZ
相关产品推荐
相关产品推荐

