在ggplot2中使用facet_grid()函数时,如何使用labeller()函数让列总计出现在facet的标签中

2023-12-08

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

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()的贴标签函数来获取在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)) 

我希望有人能够帮助我。

Thanks.


经过最少的修改,以下代码(仅最后一个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)) 

给出这个输出:

output

请注意,无论组内有多少个组,这都有效grpA.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在ggplot2中使用facet_grid()函数时,如何使用labeller()函数让列总计出现在facet的标签中 的相关文章

  • R从列表中提取数据框,列名中没有前缀

    我在列表中放置了一个数据框 然后 当尝试将其提取回来时 我得到了该数据帧的所有以列表键为前缀的列名称 有没有办法完全按照最初传递的方式提取数据帧 cols lt c column1 Column2 Column3 df1 lt data f
  • R read_excel:libxls 错误:无法解析文件

    我试图使用 readxl read excel 将 xls 文件读入 R 但它给出了以下错误 Error filepath data xls libxls error Unable to parse file 还尝试了 readxl exc
  • R 中的 NA 替换函数

    我正在尝试替换矩阵中的 NA mat 零 我在用着mat is na mat lt 0 当我有 18946 个变量的 94531 个观察值或更小的矩阵时 效果很好 但我在 22752 个变量的 112039 个观察值的矩阵上尝试它 R 显示
  • 使用底格里斯河从纬度/经度获取人口普查区

    我有相对较多的坐标 我想获取其人口普查区 除了 FIPS 代码 我知道我可以使用以下命令查找各个纬度 经度对call geolocator latlon 已完成here https stackoverflow com questions 5
  • 如何在不循环的情况下添加组ID?

    我有数据框 例如 productid ordernum p1 10 p2 20 p3 30 p4 5 p5 20 p6 8 我想添加另一列 称为 groupid 它将产品按顺序分组在一起 一旦 sum ordernum 达到 30 分配一个
  • 将列表中的列转换为 R 中的数据框

    我有使用 R 创建的以下列表 set seed 326581 X1 rnorm 10 0 1 Y1 rnorm 10 0 2 data data frame X1 Y1 lst lt replicate 100 df smpl lt dat
  • 查找数据帧列表中同一列中的所有重复值并将其转换为 NULL

    我有一个清单BELGIAN COAST list包含数百个数据帧 df1 df2 15 列 X 1000 行 每个数据帧的最后一列称为Chemicals并包含一些字符 例如Sulfate or Ammonia 但是这一列有很多行Chemic
  • 如何在 R 中为传单中的数值变量设置不对称颜色渐变

    我想让传单调色板以零为中心 红白绿发散 我已经尝试过中所说的这个帖子 https stackoverflow com questions 29262824 r center color palette on 0 当我尝试手动创建颜色时 我得
  • 如何获得属于五分位数的x?

    我正在大学学习使用 R 进行计量经济学项目 所以请原谅我的笨拙 基本上 使用并给出 一个矩阵 股票价格 行 天 列 公司股票价格 另一个矩阵 市值 行 天 列 公司市值 我必须收集第三个矩阵每天观察的属于市值分布第一五分位数的股票价格 然后
  • 如何更改 Shiny 中 navbarPage 折叠的断点

    我想用shiny navbarPage collapsible TRUE 当在小屏幕上查看我的 Shiny 应用程序时 将导航元素折叠到菜单中 默认情况下 当浏览器宽度小于 940 像素时会触发折叠 有什么方法可以改变这一点 以便在稍大的浏
  • 将函数应用于 3d 数组的每一层,返回一个数组

    假设您有一个包含行 列和层的 3 维数组 A lt array 1 27 c 3 3 3 想象你有一个函数 它接受一个矩阵作为输入并返回一个矩阵作为输出 就像t 如何将该函数应用于数组的每一层 返回与第一层大小相同的另一个数组 我觉得我应该
  • 将数据从 R 导出到 Excel

    我试图将从 R 获得的一些结果导出到 Excel 中 但未成功 我尝试过以下代码 write table ALBERTA1 D ALBERTA1 txt sep t write csv ALBERTA1 ALBERTA1 csv your
  • glmnet 未从 cv.glmnet 收敛 lambda.min

    我跑了20倍cv glmnet套索模型以获得 lambda 的 最佳 值 但是 当我尝试重现结果时glmnet 我收到一个错误 内容如下 Warning messages 1 from glmnet Fortran code error c
  • 为什么这些数字不相等?

    下面的代码显然是错误的 有什么问题 i lt 0 1 i lt i 0 05 i 1 0 15 if i 0 15 cat i equals 0 15 else cat i does not equal 0 15 i does not eq
  • R 中的字符串作为函数参数

    数据框chocolates列出了糖果的类型以及每种糖果的一组评级 ID sweetness filling crash snickers 0 67 0 55 0 40 milky way 0 81 0 53 0 56 我正在编写一个函数 它
  • r 中的 5 维图

    我正在尝试在 R 中绘制 5 维图 我目前正在使用rgl包以 4 个维度绘制数据 使用 3 个变量作为 x y z 坐标 另一个变量作为颜色 我想知道是否可以使用这个包添加第五个变量 例如空间中点的大小或形状 这是我的数据和当前代码的示例
  • 带 R 的多彩标题

    我想添加颜色某些词在我的图表标题中 我已经能够在这里找到一些先例 http blog revolutionanalytics com 2009 01 multicolor text in r html 具体来说 我希望用撇号括起来的文本 在
  • R:将 JSON 时间格式转换为 POSIX

    我有一个 JSON 字符串 并将其放入数据框中 我能够做到这一点 但我在使用 apply 函数之一将所有时间字符串转换为 POSIX 格式时遇到问题 See here https stackoverflow com questions 90
  • 16 位以上整数的计算

    我有两个大整数 两者都超过 16 位 确切地说是 20 位 而且我知道由于双精度浮点运算 我在使用这些数字进行计算甚至将它们存储在变量中 独立于编程语言 时受到限制 不过 我想也许gmp图书馆应该处理它们 但不幸的是它没有 可以计算更大的整
  • 具有 dplyr、tidyverse 和 broom 的相关矩阵 - P 值矩阵

    全部 我想使用以下方法从相关矩阵中获取 p 值dplyr 和 或扫帚包 并同时测试多个变量 我知道其他方法 但 dplyr 对我来说似乎更简单 更直观 此外 dplyr 需要关联每个变量以获得特定的 p 值 这使得该过程更容易 更快 我检查

随机推荐