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

如何在ggplot2的geom_boxplot中为箱线图填充两种颜色

实现箱线图分段填充两种颜色(无需geom_rect/annotate)

核心思路

通过**叠加两个geom_boxplot()**实现分段填充:基于同一数据集生成两个箱线图,分别设置不同的宽度和水平位置,让它们在视觉上拼接成一个整体,各自使用目标填充颜色。这种方法完全依赖geom_boxplot(),无需额外的矩形标注函数。

完整可运行代码

library(ggplot2)

# 初始化对象与数据
set.seed(1)
colFill <- c("#4a7ff9", "#4aecf9")
colShader <- c("#4964a3", "#499ba2")

df <- data.frame(Values=rnorm(100, 100, 10), 
                 Group=rep(c("Blue", "Cyan"), each=50))

# 绘制分段填充箱线图
ggplot(df, aes(y=Values)) +
  # 第一段:占箱线图总宽度的80%,使用对应分组的主色
  geom_boxplot(
    aes(x=as.numeric(Group), fill=Group),
    width=0.4,  # 原宽度0.5的80%
    lwd=3,
    outlier.shape=NA  # 避免重复显示离群点
  ) +
  # 第二段:占箱线图总宽度的20%,使用第二种颜色,偏移位置实现拼接
  geom_boxplot(
    aes(x=as.numeric(Group) + 0.2, fill=factor(Group, levels=c("Blue", "Cyan"), labels=c("Cyan", "Blue"))),
    width=0.1,  # 原宽度0.5的20%
    lwd=3,
    outlier.shape=NA
  ) +
  # 设置填充颜色映射
  scale_fill_manual(values=colFill) +
  # 调整x轴刻度,保持原分组标签在拼接后箱线图的正下方
  scale_x_continuous(
    breaks=1:2,
    labels=c("Blue", "Cyan"),
    limits=c(0.5, 2.7)
  ) +
  theme_classic() +
  theme(legend.position="none")

代码说明

  • 分段宽度控制:原箱线图宽度设为0.5,第一段取80%即width=0.4,第二段取20%即width=0.1,总宽度与原箱线图一致。
  • 位置拼接:将第二段箱线图的x轴位置偏移+0.2(第一段宽度的一半),使其刚好与第一段右侧拼接,形成连续的视觉效果。
  • 离群点处理:添加outlier.shape=NA避免两个箱线图重复绘制离群点,保证图表简洁。
  • 颜色映射:如果需要所有箱线图的分段颜色固定(而非随分组变化),可直接将第二段的fill设为固定颜色值,例如fill="#4aecf9",无需放在aes()中。

内容的提问来源于stack exchange,提问作者Yacine Hajji

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 17:41:07