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

在ggplot2中为箱线图与叠加散点设置不同边框颜色的方法

解决方案

要实现箱线图边框和散点边框分别对应指定分组颜色,这里提供两种实用方案:

方案一:通过数据列绑定颜色(无需额外包)

先给数据框添加两个颜色映射列,分别对应箱线图和散点的颜色:

library(tidyverse)
set.seed(1234)
df = tribble(
    ~group,~value,
    "a",   rnorm(1000, mean = 5),
    "b",   rnorm(1000, mean = 7, sd = 1.5),
    "c",   rnorm(1000, mean = 8),
    "c",   rnorm(1000, mean = 9),
    "c",   rnorm(1000, mean = 7)
) %>%
    unnest(value) %>%
    mutate(
        # 箱线图对应颜色
        box_color = case_match(
            group,
            "a" ~ "black",
            "b" ~ "blue",
            "c" ~ "brown"
        ),
        # 散点边框对应颜色
        point_color = case_match(
            group,
            "a" ~ "red",
            "b" ~ "green",
            "c" ~ "yellow"
        )
    )

绘图时直接调用这两个颜色列,并用scale_color_identity()告诉ggplot直接使用列中的颜色值:

library(ggplot2)
ggplot(df, aes(x = group, y = value)) +
    geom_boxplot(aes(color = box_color), fill = NA, outlier.shape = NA) +
    geom_point(aes(color = point_color), shape = 21, 
               position = position_jitter(seed = 1, width = .05), 
               alpha = 0.1) +
    scale_color_identity()

方案二:使用ggnewscale创建独立颜色刻度(无需修改原始数据)

如果不想改动原始数据,可以用ggnewscale包给不同图层设置独立的颜色映射规则:

先安装并加载包:

install.packages("ggnewscale")
library(ggnewscale)

然后编写绘图代码:

library(ggplot2)
ggplot(df, aes(x = group, y = value)) +
    # 箱线图的颜色规则
    geom_boxplot(aes(color = group), fill = NA, outlier.shape = NA) +
    scale_color_manual(values = c("a" = "black", "b" = "blue", "c" = "brown")) +
    # 启动新的颜色刻度,后续图层使用独立规则
    new_scale_color() +
    # 散点边框的颜色规则
    geom_point(aes(color = group), shape = 21, 
               position = position_jitter(seed = 1, width = .05), 
               alpha = 0.1) +
    scale_color_manual(values = c("a" = "red", "b" = "green", "c" = "yellow"))

两种方案都能实现需求:分组a、b、c的箱线图边框分别为黑、蓝、棕,对应散点边框为红、绿、黄。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 12:20:25