如何在ggplot2中按变量绘制分布并添加总体分布小提琴图?
解决方法
要添加总体人群的小提琴图,核心是先构造包含“总体”类别的数据集,再用ggplot绘制:
1. 预处理数据集
把原数据复制一份,将COUNTRY列替换为“总体”,然后和原数据合并:
# 原数据 df <- data.frame(ID = 1:200, M500 = rnorm(200), COUNTRY = rep( c("PERU", "MEXICO", "COLOMBIA"),length.out = 200)) # 构造包含总体的数据集 df_total <- df df_total$COUNTRY <- "总体" df_combined <- rbind(df, df_total)
2. 修改绘图代码
用合并后的数据集df_combined绘图,此时x轴会自动包含四个类别(PERU、MEXICO、COLOMBIA、总体):
library(ggplot2) ggplot(df_combined, aes(x = COUNTRY, y = M500, color = COUNTRY, fill = COUNTRY)) + geom_violin(alpha = 0.5, trim = TRUE) + geom_point(position = position_jitter(width = 0.1), alpha = 0.5, size = 2) + stat_summary(fun = "mean", geom = "crossbar", color = "black", size = 0.5) + scale_color_brewer(palette = "Set1") + scale_fill_brewer(palette = "Set1") + theme_minimal() + labs(title = "不同国家与总体人群M500分布对比", x = "类别", y = "M500")
补充说明
- 合并数据集后,“总体”对应的所有M500值就是原数据的全部样本,绘制出的小提琴图就是总体分布
- 如果想让“总体”的颜色和其他国家区分更明显,可以手动指定颜色,替换掉
scale_color_brewer()和scale_fill_brewer():scale_color_manual(values = c("PERU" = "#E41A1C", "MEXICO" = "#377EB8", "COLOMBIA" = "#4DAF4A", "总体" = "#984EA3")) scale_fill_manual(values = c("PERU" = "#E41A1C", "MEXICO" = "#377EB8", "COLOMBIA" = "#4DAF4A", "总体" = "#984EA3"))
内容的提问来源于stack exchange,提问作者Humberto
相关产品推荐
相关产品推荐

