ggplot分面添加分布均值文本遇重叠、标签自定义及边界设置问题
解决方案
针对你提出的三个问题,对应修改逻辑如下:
- 解决文本重叠:给不同
category_3分组的均值文本设置不同的y轴坐标,错开显示位置 - 自定义均值标签:生成标签时根据
category_3的取值拼接为mean_1、mean_2格式 - 添加同色分布边界:在直方图的美学映射中增加
color = category_3,让边框和填充色保持一致
修改后的完整可运行代码如下:
library(tidyverse) # 生成分布与分类变量 distribution <- rnorm(n = 1000, mean = 0, sd = 1) category_1 <- c(rep("A", 500), rep("B", 500)) category_2 <- c(rep("C", 250), rep("D", 250), rep("C", 250), rep("D", 250)) category_3 <- factor(sample(c(0, 1), replace = TRUE, size = 1000)) # 构建数据集 tbl <- tibble(distribution, category_1, category_2, category_3) text_summary = tbl %>% group_by(category_1, category_2, category_3) %>% summarize(mean = round(mean(distribution), 2)) %>% # 自定义标签格式,根据category_3取值生成mean_1、mean_2 mutate(lab = paste0("mean_", as.numeric(category_3), " = ", mean), # 给不同分组设置不同y坐标,避免文本重叠 y_pos = ifelse(category_3 == levels(category_3)[1], 10, 12)) # 绘制直方图 ggplot(data = tbl, aes(x = distribution, fill = category_3, # 添加颜色映射,让边框和填充色保持一致 color = category_3)) + geom_histogram(position = "identity", alpha = 0.5, binwidth = 0.3) + # 可自行调整binwidth适配分布显示效果 facet_grid(category_1 ~ category_2) + geom_text(data = text_summary, aes(label = lab, x = 2, y = y_pos), color = "blue3") + theme_bw()
可选优化:如果不想手动计算文本位置,可安装加载
ggrepel包后,将geom_text替换为如下代码,系统会自动调整文本位置规避重叠:geom_text_repel(data = text_summary, aes(label = lab, x = 2, y = 10), color = "blue3")
内容的提问来源于stack exchange,提问作者SiH
相关产品推荐
相关产品推荐

