带分组箱线图中高亮指定点的R语言实现问题
问题描述
我需要在带分组的箱线图中高亮部分点。数据集包含4种diagnostic,其中diagnostic 1对应AN点,diagnostic 2对应CRC点。
无分组的箱线图可正常实现:先通过ggforce::geom_sina绘制AN点,再用geom_point添加CRC点,代码如下:
# data generation company_a <- sample(1:200, 100,replace = TRUE) company_b <- sample(1:200, 100,replace = TRUE) company_c <- sample(1:200, 100,replace = TRUE) diagnostic<- sample(1:4, 100,replace = TRUE) diagnostic<-as.factor(diagnostic) df<-data.frame(company_a,company_b,company_c,diagnostic) df_r=gather(df, "Companies", "FIT", 1:3) # extract subdataset CRC_df = df_r[df_r$diagnostic==2,] AN_df = df_r[df_r$diagnostic==1,] # Changing diagnostic ID of CRC points to identify them as AN points df_r["diagnostic"][df_r["diagnostic"] == 2]<-1 CRC_df["diagnostic"][CRC_df["diagnostic"] == 2]<-1 # Creating boxplot cl <- qualitative_hcl(5, palette = "Dark 3") ggboxplot(AN_df, x = "Companies", y = "FIT", fill = "Companies", palette = cl,alpha=0.1)+ scale_y_continuous(breaks = seq(0, 200, 25))+ ggforce::geom_sina(aes(x=Companies, y=FIT, color=Companies), size=1, alpha=0.8)+ geom_point( # add the highlight points data=CRC_df, aes(x=Companies, y=FIT,color=Companies), size=3)
这段代码能生成高亮点对应正确箱线图的图像。
但当尝试绘制df_r中所有点,并按diagnostic ID分组绘制箱线图时,代码如下:
ggboxplot(df_r, x = "diagnostic", y = "FIT", fill = "Companies", palette = cl,alpha=0.1)+ scale_y_continuous(breaks = seq(0, 200, 25))+ ggforce::geom_sina(aes(x=diagnostic, y=FIT, color=Companies), size=1, alpha=0.8)+ geom_point( # add the highlight points data=CRC_df, aes(x=diagnostic, y=FIT,color=Companies), size=3)
CRC点并未对应到AN组各公司的箱线图,而是全部聚集在AN组的中间箱线图上。我希望company_a对应的CRC点位于AN组的第一个箱线图上,其他公司同理,请问该如何解决?
解决方案
问题核心是:当用x=diagnostic作为主分组、fill=Companies作为子分组时,CRC点只指定了x=diagnostic=1,但没有和对应Companies的子分组位置对齐,导致全部堆在中间。
直接用position_dodge参数就能解决,让高亮点和对应子分组的箱线图位置匹配,完整修改代码如下:
# data generation company_a <- sample(1:200, 100,replace = TRUE) company_b <- sample(1:200, 100,replace = TRUE) company_c <- sample(1:200, 100,replace = TRUE) diagnostic<- sample(1:4, 100,replace = TRUE) diagnostic<-as.factor(diagnostic) df<-data.frame(company_a,company_b,company_c,diagnostic) df_r=gather(df, "Companies", "FIT", 1:3) # 提取CRC数据,保留原始diagnostic=2的标记,无需修改 CRC_df = df_r[df_r$diagnostic==2,] # 创建颜色 palette cl <- qualitative_hcl(5, palette = "Dark 3") # 绘制带分组的箱线图,高亮CRC点 ggboxplot(df_r, x = "diagnostic", y = "FIT", fill = "Companies", palette = cl, alpha=0.1, position = position_dodge(width = 0.8))+ # 开启子分组并排 scale_y_continuous(breaks = seq(0, 200, 25))+ ggforce::geom_sina(aes(x=diagnostic, y=FIT, color=Companies), size=1, alpha=0.8, position = position_dodge(width = 0.8))+ # sina点和箱线图对齐 geom_point( # 高亮CRC点 data=CRC_df, aes(x=1, y=FIT, color=Companies), # 直接指定x为AN组的位置(diagnostic=1) size=3, position = position_dodge(width = 0.8))+ # 和子分组位置匹配 # 可选:优化x轴标签,更清晰 scale_x_discrete(labels = c("AN", "CRC", "诊断3", "诊断4"))
关键细节
- 把CRC点的x轴直接设为
1(对应AN组的位置),无需修改原始diagnostic值; - 所有涉及子分组的图层(箱线图、sina点、高亮点)都加上
position_dodge(width = 0.8),确保同一Companies的元素在同一垂直线上; - 宽度值
0.8是ggplot箱线图的默认dodge宽度,保持一致就能完美对齐。
内容的提问来源于stack exchange,提问作者Rosalie Plantefève
相关产品推荐
相关产品推荐

