如何在R的ggplot中为分组箱线图实现类别+性别分层配色?
实现分层颜色的分组箱线图(ggplot2)
完全可以实现你要的效果,核心思路是将种族+性别的组合作为填充色的映射维度,手动或程序化指定“种族对应主色、性别控制深浅”的配色方案,再通过position_dodge实现同种族内男女箱线图的并排展示。
步骤1:构造模拟数据(替换为你的真实数据即可)
library(ggplot2) library(dplyr) set.seed(123) # 生成包含种族、性别、测试分数的模拟数据集 df <- expand.grid(race = c("White", "Black", "Asian"), gender = c("male", "female")) %>% group_by(race, gender) %>% mutate(test_score = rnorm(50, mean = case_when(race == "White" ~ 75, race == "Black" ~ 70, race == "Asian" ~ 80) + case_when(gender == "female" ~ 3, TRUE ~ 0), sd = 8)) %>% ungroup()
步骤2:指定配色方案(两种方式可选)
方式一:手动定义颜色值
直接为每个(种族,性别)组合指定深浅对应的色值:
color_palette <- c( "White_male" = "#ff9999", # 男性白人:浅红 "White_female" = "#cc0000", # 女性白人:深红 "Black_male" = "#99ccff", # 男性黑人:浅蓝 "Black_female" = "#0066cc", # 女性黑人:深蓝 "Asian_male" = "#cc99ff", # 男性亚裔:浅紫 "Asian_female" = "#9933cc" # 女性亚裔:深紫 )
方式二:用colorspace包自动生成深浅色
如果不想手动找色值,可以用colorspace的lighten函数基于种族主色生成浅色(男性)和原色(女性):
library(colorspace) # 定义种族对应的主色 base_colors <- c(White = "#cc0000", Black = "#0066cc", Asian = "#9933cc") # 生成深浅色组合:男性用浅40%的色调,女性用主色 color_palette <- c( set_names(lighten(base_colors, 0.4), paste0(names(base_colors), "_male")), set_names(base_colors, paste0(names(base_colors), "_female")) ) # 调整顺序,让同种族的男女组合挨在一起 color_palette <- color_palette[c("White_male", "White_female", "Black_male", "Black_female", "Asian_male", "Asian_female")]
步骤3:绘制分组箱线图
ggplot(df, aes(x = race, y = test_score, fill = interaction(gender, race))) + # 设置箱线图的并排间距,避免重叠 geom_boxplot(position = position_dodge(width = 0.8), width = 0.7) + # 应用自定义配色方案,修改图例标签和名称 scale_fill_manual(values = color_palette, labels = c("White Male", "White Female", "Black Male", "Black Female", "Asian Male", "Asian Female"), name = "Demographic Group") + # 设置坐标轴和标题 labs(x = "Race", y = "Test Score", title = "Test Scores by Race and Gender") + # 选用简洁的主题(可替换为你喜欢的主题) theme_minimal()
关键细节说明
interaction(gender, race)将两个变量组合成唯一的分组标识,确保每个(种族,性别)对对应独立的填充色position_dodge(width = 0.8)让同种族的两个箱线图并排展示,width = 0.7控制单个箱线图的宽度,避免拥挤- 配色方案完全可自定义,你可以根据需求调整色值或深浅程度
内容的提问来源于stack exchange,提问作者inprogress123
相关产品推荐
相关产品推荐

