如何在ggplot2绘制的象限图各象限中添加数据计数?
象限图添加象限标识与数据计数的实现方案
实现步骤与完整代码
先给数据标记象限,统计每个象限的样本量,最后在图表上添加对应的标识和计数:
library(dplyr) library(ggplot2) # 计算坐标轴中点(简化写法) x_mid <- mean(range(iris$Petal.Length, na.rm = TRUE)) y_mid <- mean(range(iris$Petal.Width, na.rm = TRUE)) # 预处理:标记象限 + 统计每个象限的计数与文本位置 quad_info <- iris %>% mutate(quadrant = case_when( Petal.Length > x_mid & Petal.Width > y_mid ~ "Q1", Petal.Length <= x_mid & Petal.Width > y_mid ~ "Q2", Petal.Length <= x_mid & Petal.Width <= y_mid ~ "Q3", TRUE ~ "Q4" )) %>% group_by(quadrant) %>% summarize( 样本量 = n(), # 计算每个象限的文本放置中心 x_center = ifelse(quadrant %in% c("Q1", "Q4"), mean(c(max(Petal.Length), x_mid)), mean(c(min(Petal.Length), x_mid))), y_center = ifelse(quadrant %in% c("Q1", "Q2"), mean(c(max(Petal.Width), y_mid)), mean(c(min(Petal.Width), y_mid))) ) # 绘制图表并添加标识 iris %>% mutate(quadrant = case_when( Petal.Length > x_mid & Petal.Width > y_mid ~ "Q1", Petal.Length <= x_mid & Petal.Width > y_mid ~ "Q2", Petal.Length <= x_mid & Petal.Width <= y_mid ~ "Q3", TRUE ~ "Q4" )) %>% ggplot(aes(x = Petal.Length, y = Petal.Width, color = quadrant)) + geom_vline(xintercept = x_mid) + geom_hline(yintercept = y_mid) + geom_point() + # 添加象限名和样本量(合并显示) geom_text(data = quad_info, aes(x = x_center, y = y_center, label = paste0(quadrant, "\n样本量: ", 样本量), color = quadrant), size = 5, fontface = "bold") + theme_minimal()
关键说明
- 中点计算:用
range()函数直接获取数据的最大最小值,简化代码逻辑。 - 文本位置:通过判断象限,计算每个象限的中心坐标,确保标识放在象限的显眼位置,不会被数据点遮挡。
- 灵活调整:如果需要分开显示象限名和计数,可以拆分两个
geom_text,调整y坐标让它们上下排列,比如计数放在象限名下方0.1个单位的位置。
内容的提问来源于stack exchange,提问作者nicholaspooran
相关产品推荐
相关产品推荐

