You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 21:45:38