如何用ggplot绘制按性别分组的各年龄事件累计均值折线图
R实现按性别分组的年龄累计事件均值折线图
实现逻辑
- 第一步:对每个个体,按年龄从小到大排序,计算截至每个年龄的事件累计发生数
- 第二步:按性别、年龄分组,对同组所有个体的累计事件数取平均值,得到对应群体的累计均值
- 第三步:以年龄为横轴、累计均值为纵轴,按性别分组绘制折线图
提示:如果你的原始数据存在缺失值,计算均值时可修改为
mean(cum_event, na.rm = TRUE)自动过滤缺失值。
完整代码
你需要提前安装tidyverse包(包含数据处理用的dplyr和绘图用的ggplot2),运行以下代码即可:
# 加载依赖包 library(tidyverse) # 示例数据 set.seed(123) id <- rep(1:8, each = 5) female <- c(rep(1,20), rep(0, 20)) age <- rep(20:24, 8) dat <- data.frame(id, female, age) dat$event <- sample(rep(c(1, 0), nrow(dat) / 2)) # 计算绘图所需的累计均值数据 plot_dat <- dat %>% # 按个体分组,计算单个体各年龄累计事件数 group_by(id) %>% arrange(age, .by_group = TRUE) %>% mutate(cum_event = cumsum(event)) %>% ungroup() %>% # 按性别、年龄分组计算群体累计均值 group_by(female, age) %>% summarise(cum_mean = mean(cum_event), .groups = "drop") %>% # 转换性别为带文字标签的因子,优化图例显示 mutate(gender = factor(female, levels = c(0, 1), labels = c("男性", "女性"))) # 绘制折线图 ggplot(plot_dat, aes(x = age, y = cum_mean, color = gender, group = gender)) + # 绘制折线 geom_line(linewidth = 1) + # 加数据点方便读取具体数值 geom_point(size = 2) + # 设置x轴刻度为20-24整数 scale_x_continuous(breaks = 20:24) + # 设置轴标签和图例标题 labs( x = "年龄", y = "平均累计事件发生数", color = "性别" ) + # 用清晰的黑白主题 theme_bw()
内容的提问来源于stack exchange,提问作者johnny
相关产品推荐
相关产品推荐

