如何使用purrr::map与ggplot2为每张生成的图表添加自定义标题
解决方案
核心修正逻辑
- 要实现变量和标题一一对应输出,使用
purrr::map2()同时遍历等长的列序列和标题序列,避免生成全排列图表 - 修正原代码的参数定义、变量引用、文本匹配、语法错误等问题
完整可运行代码
# 加载依赖包 library(purrr) library(dplyr) library(ggplot2) # 测试数据 test <- tibble(s1 = c("Agree", "Neutral", "Strongly Disagree"), s2rl = c("Agree", "Neutral", "Strongly Disagree"), f1 = c("Strongly Agree", "Disagree", "Strongly Disagree"), f2rl = c("Strongly Agree", "Disagree", "Strongly Disagree")) # 标题向量 titles <- c("S1 results", "Results for S2RL", "Fiscal Results for F1", "Financial Status of F2RL") # 修正后的绘图函数 my_plots = function(col_name, title) { # 计算该列总有效样本量 total_n <- sum(!is.na(test[[col_name]])) test %>% count(.data[[col_name]]) %>% mutate(percent = 100*(n / sum(n, na.rm = TRUE))) %>% ggplot(aes(x = .data[[col_name]], y = percent, fill = .data[[col_name]])) + geom_bar(stat = "identity") + ylab("Percentage") + ggtitle(paste(title, "| N =", total_n)) + coord_flip() + theme_minimal() + # 修正色值匹配的大小写,和数据文本对齐 scale_fill_manual(values = c("Strongly Disagree" = "#CA001B", "Disagree" = "#1D28B0", "Neutral" = "#D71DA4", "Agree" = "#00A3AD", "Strongly Agree" = "#FF8200"), drop = FALSE) + # 修正标签匹配的大小写 scale_x_discrete(labels = c("Strongly Disagree" = "Strongly\nDisagree", "Disagree" = "Disagree", "Neutral" = "Neutral", "Agree" = "Agree", "Strongly Agree" = "Strongly\nAgree"), drop = FALSE) + theme(axis.title.y = element_blank(), axis.text = element_text(size = 9, color = "gray28", face = "bold", hjust = .5), axis.title.x = element_text(size = 12, color = "gray32", face = "bold"), legend.position = "none", text = element_text(family = "Arial"), plot.title = element_text(size = 14, color = "gray32", face = "bold", hjust = .5)) + ylim(0, 100) } # 调用map2一一映射生成4张图,结果存在plot_list中 plot_list <- map2(.x = names(test), .y = titles, .f = my_plots)
关键改动说明
- 替换
map为map2:同时传入列名和标题两个等长序列,按位置一一对应调用绘图函数,不会生成多余的全排列图表 - 绘图函数新增
title入参,解决原函数未定义title参数的报错问题 - 列引用改用
.data[[col_name]]:适配字符串列名的引用场景,避免非标准求值的兼容问题 - 修正色值、标签的文本匹配:将原代码中小写开头的选项文本改为和测试数据一致的首字母大写格式,避免配色、标签不生效
- 修正样本量计算:提前计算该列总有效样本量,解决原代码直接引用分类计数
n导致的向量长度不匹配报错 - 修正语法错误:补全原代码遗漏的管道符右尖括号,调整标题格式提升可读性
生成的4张图表存储在plot_list中,按索引访问即可查看对应图表,比如运行plot_list[[1]]查看第一个变量的柱状图。
内容的提问来源于stack exchange,提问作者J.Sabree
相关产品推荐
相关产品推荐

