如何在R的ggplot2中绘制留存学生占比的热力图?
计算留存学生占比并绘制热力图的解决方案
我明白你想要的是每个年-月-周组合里,留存学生(Retention_Status=1)的数量占该时间段总人数的比例热力图,之前的代码只是统计了各分组的count,确实需要调整数据处理逻辑来计算占比。这里有两种简洁的实现方式,你可以根据自己的习惯选择:
方法一:先统计分组count再计算占比
这种方式和你原来的代码逻辑衔接更紧密,先保留你原有的分组统计步骤,再拓展计算占比:
library(dplyr) library(ggplot2) # 1. 先按年、月、周、留存状态分组统计人数 Admit_grouped <- Admit %>% group_by(year, month, week, Retention_Status) %>% summarize(count = n(), .groups = "drop") # .groups="drop"避免后续分组冲突 # 2. 按年、月、周分组计算总人数,再算出留存占比 Admit_retention_ratio <- Admit_grouped %>% group_by(year, month, week) %>% mutate( total_weekly = sum(count), # 计算该年月周的总学生数 retention_ratio = ifelse(Retention_Status == 1, count / total_weekly, NA) ) %>% filter(!is.na(retention_ratio)) # 只保留留存状态为1的占比数据 # 3. 绘制热力图 ggplot(Admit_retention_ratio, aes(x = 1, y = week, fill = retention_ratio)) + geom_tile(colour = "white") + facet_grid(year ~ month) + scale_fill_gradient( low = "red", high = "green", labels = scales::percent # 将小数转换为百分比显示 ) + labs( title = "学生周留存占比热力图", x = "", # 因为x轴只有1个类别,无需标注 y = "周数", fill = "留存占比" )
方法二:一步到位计算留存占比(更高效)
因为你的Retention_Status是0和1的标识,我们可以直接利用均值来计算占比——把Retention_Status == 1转换为布尔值(TRUE=1,FALSE=0),取均值就是留存的比例,代码更简洁:
library(dplyr) library(ggplot2) # 直接按年、月、周分组,计算留存占比 Admit_retention_ratio <- Admit %>% group_by(year, month, week) %>% summarize( retention_ratio = mean(Retention_Status == 1), .groups = "drop" ) # 绘制热力图(和方法一的绘图代码一致) ggplot(Admit_retention_ratio, aes(x = 1, y = week, fill = retention_ratio)) + geom_tile(colour = "white") + facet_grid(year ~ month) + scale_fill_gradient( low = "red", high = "green", labels = scales::percent ) + labs( title = "学生周留存占比热力图", x = "", y = "周数", fill = "留存占比" )
关键说明
- 两种方法最终的绘图效果是一致的,方法二更高效,少了一次分组统计的步骤
scales::percent用来把0-1的小数转换为百分比格式,让图例更直观易懂- 如果你的
Retention_Status后续有其他取值(比如不是0/1),方法一的兼容性更强,只需要调整ifelse里的条件即可
内容的提问来源于stack exchange,提问作者John Thomas
相关产品推荐
相关产品推荐

