如何在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
相关产品推荐
相关产品推荐

