为分组箱线图添加抖动:消除箱内不同类别点的分离
问题描述
现有如下R代码,意图根据年龄将数据点绘制在每个箱线的左侧(Young,黑色点)或右侧(Old,红色点),但当前生成的图中,箱内黑色与红色点相互分离,无法围绕对应箱线的中线抖动。需求是让两类点分别分布在对应箱线的左右两侧,均围绕中线进行抖动。
原代码如下:
set.seed(100) df_data <- expand.grid(group=c("A", "B", "C", "D"), size=c("Small", "Large"), age=c("Young", "Old"), stringsAsFactors=T) df_data <- df_data[rep(c(1:nrow(df_data)), 10),] df_data <- cbind(df_data, value=rnorm(nrow(df_data))) p <- ggplot(data=df_data, mapping=aes(x=group, y=value)) + geom_boxplot(aes(fill=size), outlier.shape=NA) + scale_fill_manual(values = c(rgb(240,200,200, maxColorValue=255), rgb(198,210,233, maxColorValue=255))) + geom_point(aes(shape=size, color=age), position=position_jitterdodge()) + scale_shape_manual(values=c(16, 16)) + scale_color_manual(values=c("black", "red"))
解决方案
要实现目标效果,需调整点的分组逻辑和抖动偏移参数,让年龄作为分组依据控制左右偏移,同时匹配箱线宽度确保对齐。修改后的代码如下:
set.seed(100) df_data <- expand.grid(group=c("A", "B", "C", "D"), size=c("Small", "Large"), age=c("Young", "Old"), stringsAsFactors=T) df_data <- df_data[rep(c(1:nrow(df_data)), 10),] df_data <- cbind(df_data, value=rnorm(nrow(df_data))) p <- ggplot(data=df_data, mapping=aes(x=group, y=value)) + geom_boxplot(aes(fill=size), outlier.shape=NA, width=0.7) + # 统一箱线宽度,方便点偏移对齐 scale_fill_manual(values = c(rgb(240,200,200, maxColorValue=255), rgb(198,210,233, maxColorValue=255))) + geom_point(aes(shape=size, color=age, group=age), # 指定分组为年龄,让偏移基于年龄组 position=position_jitterdodge( dodge.width=0.7, # 匹配箱线宽度,确保点在箱线范围内偏移 jitter.width=0.2 # 控制左右抖动幅度,避免点过度分散 )) + scale_shape_manual(values=c(16, 16)) + scale_color_manual(values=c("black", "red")) print(p)
关键修改说明
group=age:将点的分组依据设置为年龄,这样抖动偏移会针对Young和Old两个组分别处理,实现左右分布dodge.width=0.7:与箱线的width参数保持一致,确保点的偏移范围和箱线宽度匹配,避免点超出箱线区域jitter.width=0.2:控制点在左右方向的抖动幅度,让点围绕箱线中线的左右两侧分散,既满足分组要求又保证可读性
内容的提问来源于stack exchange,提问作者Benoit Casault
相关产品推荐
相关产品推荐

