You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

带分组箱线图中高亮指定点的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 15:35:26