首页 > 解决方案 > 在 ggplot2 中使用 facet_grid() 函数时,如何使用 labeller() 函数使列总计出现在构面的标签中

问题描述

这是一个数据集,可以为我的问题提供背景信息:

library(tidyr); library(dplyr); library(ggplot2)
set.seed(1)
dfr2 <- tibble(x1 = factor(sample(letters[1:3], 50, replace = T), levels=letters[1:3]),
             x2 = factor(sample(letters[1:2], 50, replace = T), levels=letters[1:2]),
             x3 = factor(sample(letters[1:3], 50, replace = T), levels=letters[1:3]),
             grpA = factor(sample(c("grp1","grp2"),50, prob=c(0.3, 0.7) ,replace=T), levels = c("grp1", "grp2")),
             grpB = factor(sample(c("grp1","grp2"),50, prob=c(0.6, 0.4) ,replace=T), levels = c("grp1", "grp2"))
             )

head(dfr2)

这是一个准备绘图数据的函数:


plot_data_prepr <- function(dat, groupvar, mainvar){
  
  groupvar <- sym(groupvar)
  mainvar <- sym(mainvar)
  
  plot_data <- dat %>% 
    group_by(!!groupvar) %>% 
    count(!!mainvar, .drop = F) %>% drop_na() %>% 
    mutate(pct = n/sum(n),
         pct2 = ifelse(n == 0, 0.005, n/sum(n)),
         grp_tot = sum(n),
         pct_lab = paste0(format(pct*100, digits = 1),'%'),
         pct_pos = pct2 + .02)
  
  return(plot_data)
}

这是该功能的正常用法:


plot_data_prepr(dat = dfr2, groupvar = "grpA", mainvar = "x1")

我的目标是使用带有 facet_grid() 的 labeller 函数来获取在 plot_data_prepr() 函数中计算的“grp_tot”变量,以粘贴到 facet_grid() 调用中的正确构面,这样构面的两个标签将结束是'grp1(N = 20)','grp2(N = 30)'。

我可以成功地将字符串附加到因子级别:


plusN <- function(string) {
  label <- paste0(string, ' (N = ',')')
  label
}

ggplot(plot_data_prepr(dfr2, "grpA", "x1"),
                 aes(x = x1, y = pct2, fill = x1)) +
      geom_bar(stat = 'identity') +
      ylim(0,1) +
      geom_text(aes(label=pct_lab, y = pct_pos + .02)) +
      facet_grid(. ~ grpA, labeller = labeller(grpA = plusN)) 

但是当我尝试将“grp_tot”变量的评估版本粘贴到 plusN 函数时,它找不到该变量。我想我需要以某种方式延迟 plusN 函数中“grp_tot”的评估,直到它在 facet_grid() 中被调用,但我不知道该怎么做:


plusN <- function(string) {
  label <- paste0(string, ' (N = ',eval.parent(grp_tot),')')
  label
}

ggplot(plot_data_prepr(dfr2, "grpA", "x1"),
                 aes(x = x1, y = pct2, fill = x1)) +
      geom_bar(stat = 'identity') +
      ylim(0,1) +
      geom_text(aes(label=pct_lab, y = pct_pos + .02)) +
      facet_grid(. ~ grpA, labeller = labeller(grpA = plusN)) 

我希望有人能帮助我。

谢谢。

标签: rggplot2

解决方案


只需最少的修改,以下代码(仅最后一个ggplot

dd <- plot_data_prepr(dat = dfr2, groupvar = "grpA", mainvar = "x1")

lookup <- unique(dd$grp_tot)

plusN <- function(string) {
  label <- paste0(string, ' (N = ',lookup,')')
  label
}

ggplot(plot_data_prepr(dfr2, "grpA", "x1"),
       aes(x = x1, y = pct2, fill = x1)) +
  geom_bar(stat = 'identity') +
  ylim(0,1) +
  geom_text(aes(label=pct_lab, y = pct_pos + .02)) +
  facet_grid(. ~ grpA, labeller = labeller(grpA = plusN)) 

给出这个输出:

输出

请注意,无论grpA.


推荐阅读