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

