R ggplot2分面散点图按象限展示均值中位数等统计量的实现问题
实现方案
现有ggpubr、ggpp包的内置统计层不支持按象限拆分计算统计值,我们可以通过提前给数据打象限标签+预计算分面-象限维度统计值的方式实现需求,全程兼容ggplot2的分面逻辑,灵活支持任意统计指标的输出。
完整可运行代码如下:
library(ggplot2) library(ggpp) library(dplyr) library(glue) # 设定象限分割阈值 x_thresh <- 3 y_thresh <- 9 # 原始数据 data <- data.frame( xlabel = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), ylabel = c(10, 12, 14, 16, 18, 6, 5, 4, 3, 2), facets = c("a", "a", "a", "a", "a", "b", "b", "b", "b", "b") ) # 步骤1:给每个点打象限标签 data$quadrant <- case_when( data$xlabel > x_thresh & data$ylabel > y_thresh ~ "象限1", data$xlabel <= x_thresh & data$ylabel > y_thresh ~ "象限2", data$xlabel <= x_thresh & data$ylabel <= y_thresh ~ "象限3", data$xlabel > x_thresh & data$ylabel <= y_thresh ~ "象限4" ) # 步骤2:按分面+象限分组计算所需统计指标 stats <- data %>% group_by(facets, quadrant) %>% summarise( count = n(), x_mean = mean(xlabel, na.rm = T), y_mean = mean(ylabel, na.rm = T), x_median = median(xlabel, na.rm = T), y_median = median(ylabel, na.rm = T), # 此处可按需添加相关系数、分位数等其他指标 .groups = "drop" ) # 步骤3:给统计值指定每个象限的标注位置,避免遮挡 stats <- stats %>% mutate( label_x = case_when( quadrant %in% c("象限1", "象限4") ~ x_thresh + diff(range(data$xlabel))*0.1, quadrant %in% c("象限2", "象限3") ~ x_thresh - diff(range(data$xlabel))*0.1 ), label_y = case_when( quadrant %in% c("象限1", "象限2") ~ y_thresh + diff(range(data$ylabel))*0.1, quadrant %in% c("象限3", "象限4") ~ y_thresh - diff(range(data$ylabel))*0.1 ), # 拼接要展示的文本 label_text = glue("点数:{count}\nx均值:{round(x_mean,1)}\ny均值:{round(y_mean,1)}\nx中位数:{x_median}\ny中位数:{y_median}") ) # 绘图 ggplot(data = data, aes(x = xlabel, y = ylabel, color = facets)) + geom_point() + facet_wrap(facets ~ .) + geom_quadrant_lines(xintercept = x_thresh, yintercept = y_thresh) + # 加载预计算的统计值标注 geom_text(data = stats, aes(x = label_x, y = label_y, label = label_text), color = "black", size = 3, hjust = "inward", vjust = "inward")
可根据需求灵活调整:
- 统计计算环节可自定义添加任意需要的指标
- 调整
label_x、label_y的偏移规则,适配不同的数据范围和标注展示需求 - 不需要展示空象限标注时,直接过滤统计值中
count=0的行即可
内容的提问来源于stack exchange,提问作者K.RAC
相关产品推荐
相关产品推荐

