r - 在 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))
我希望有人能帮助我。
谢谢。
解决方案
只需最少的修改,以下代码(仅最后一个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
.
推荐阅读
- javascript - 我正在尝试使用 JS 制作更新引擎,但我不知道我做错了什么
- java - 如何在 IntelliJ IDEA 中为 Maven Java 项目禁用 Kotlin 编译器?
- wordpress - 在已经有 Wordpress 主题的主页上添加内容
- java - 获取所有类参数及其名称?
- java - @Column 注释还不足以让 JPA 将一个驼峰式 Java 属性映射到数据库上的一个蛇形列吗?
- android-studio - 安装 android studio 时出现 Stacktrace.txt 错误
- filemaker - Filemaker Pro 18 从所有表中删除所有记录
- java - 无法弄清楚如何访问由 swagger 自动生成的 jaxrs 服务器中的请求标头
- flutter - OAuth2:注销后没有登录对话框,直接登录最后一个用户
- android - 在我的 Android 应用中的活动之间切换后,如何切换回上一个片段?