如何用ggplot为每所高中批量生成单独的大学入学率年度折线图
104所高中独立折线图批量生成方案
两种可直接落地的实现方式,均不需要逐个筛选学校名称:
方式1:分面统一展示(适合快速概览所有学校趋势)
通过ggplot自带的facet_wrap参数自动按学校拆分生成子图,所有子图会排列在同一张画布上:
ggplot(nsc_enroll, aes(x = chrt_grad, y = enrolled)) + geom_line() + geom_point() + # 按学校拆分子图,scales参数设置为free_y可让每个子图Y轴自适应取值范围 facet_wrap(~school, scales = "free_y") + labs(x = "毕业年份", y = "大学入学比例")
如果104个子图排列后太挤,可以调整ncol/nrow参数控制行列数,或者拆分多批次生成。
方式2:批量生成独立图片(适合每个学校单独导出使用)
如果需要每个学校的图单独保存为文件、或者单独调用,用purrr包批量处理最便捷,代码如下:
第一步:批量生成所有学校的图表存入列表
library(tidyverse) # 按学校拆分数据集,自动生成所有学校的折线图 plot_list <- nsc_enroll %>% split(.$school) %>% map(~ ggplot(.x, aes(x = chrt_grad, y = enrolled)) + geom_line() + geom_point() + labs(title = paste0(unique(.x$school), " 历年大学入学比例"), x = "毕业年份", y = "大学入学比例")) # 可直接调用任意学校的图,例如查看Alba高中的图表 plot_list[["Alba"]]
第二步:批量导出为独立图片文件
# 所有图片会导出到当前工作目录,文件名为「学校名_入学比例趋势.png」 iwalk(plot_list, ~ ggsave( filename = paste0(.y, "_入学比例趋势.png"), plot = .x, width = 6, height = 4, dpi = 150 ))
基础R循环实现(无需加载purrr)
如果不想引入额外包,用基础循环也可实现相同效果:
# 提取所有不重复的学校名称 all_schools <- unique(nsc_enroll$school) # 循环生成并导出所有学校的图表 for (school_name in all_schools) { tmp_df <- subset(nsc_enroll, school == school_name) p <- ggplot(tmp_df, aes(x = chrt_grad, y = enrolled)) + geom_line() + geom_point() + labs(title = paste0(school_name, " 历年大学入学比例"), x = "毕业年份", y = "大学入学比例") ggsave(paste0(school_name, "_入学比例趋势.png"), p, width = 6, height = 4) }
内容的提问来源于stack exchange,提问作者Shannon
相关产品推荐
相关产品推荐

