如何将ggplot代码封装为可复用函数并包含facet_wrap条件
封装带分面功能的可复用ggplot柱状图函数
需求背景
需要将给定的ggplot柱状图代码封装成可复用函数,用于处理结构相似的数据集,同时保留分面(facet_wrap)功能。
原代码回顾
原代码实现了按球队分面,展示pre/post阶段的得分中位数,并在柱子上方显示数值和样本量:
df <- data.frame (pre_post = c("pre", "post","pre","post","pre","post","pre","post"), team = c("Lakers", "Lakers","Miami Heat","Miami Heat","Celtics","Celtics","Warriors","Warriors"), median_score_time = c("3", "2","5","7","9","8","2","3"), total_plays= c("105","134","90","124","97","106","131","121")) df %>% ggplot(aes( fill=pre_post, x=pre_post, y=median_score_time, label=paste0(median_score_time, "\n(n=",total_plays,")") )) + geom_col(width=0.5) + geom_text(vjust=-0.2, size=3) + ylab("Median_Minutes_To_Score") + xlab("") + facet_wrap(~team)
封装后的函数
下面是封装完成的可复用函数,支持自定义变量、分面字段和标签:
plot_score_median <- function(data, x_var, fill_var, y_var, n_var, facet_var, y_label = "Median_Minutes_To_Score", x_label = "") { # 转换y变量为数值型(避免原数据为字符型时绘图出错) data <- data %>% mutate({{y_var}} := as.numeric({{y_var}})) ggplot(data, aes( x = {{x_var}}, fill = {{fill_var}}, y = {{y_var}}, label = paste0({{y_var}}, "\n(n=", {{n_var}}, ")") )) + geom_col(width = 0.5) + geom_text(vjust = -0.2, size = 3) + ylab(y_label) + xlab(x_label) + facet_wrap(reformulate(as_label(enquo(facet_var)))) }
函数调用示例
用原数据集调用函数,效果和原代码一致:
# 调用函数 plot_score_median( data = df, x_var = pre_post, fill_var = pre_post, y_var = median_score_time, n_var = total_plays, facet_var = team, y_label = "Median_Minutes_To_Score" )
关键说明
- 使用
{{}}(大括号语法)实现非标准求值,直接传入数据框中的变量名即可,无需加引号 reformulate(as_label(enquo(facet_var)))用于将传入的分面变量转换为facet_wrap需要的公式格式- 增加了y变量的数值转换,兼容字符型数值的数据集
- 保留了自定义坐标轴标签的参数,提升函数灵活性
内容的提问来源于stack exchange,提问作者Pxanalyst
相关产品推荐
相关产品推荐

