【问题标题】:ggplot - writing a function to create ggplot - how to assign parameter correctly?ggplot - 编写一个函数来创建 ggplot - 如何正确分配参数?
【发布时间】:2020-04-12 20:30:15
【问题描述】:

我找不到这个简单问题的答案:

我想创建一个 ggplot。 aes 参数部分来自向量,部分直接分配。

names(mydt)
"gender"     "cat1"        "category_b"    "value"


category_a <- "cat1"

plot.sum <- mydt %>%
  dplyr::group_by(category_a, category_b) %>%
  ggplot(aes(x = category_a, y = N, fill = category_b)) +
  geom_bar(position="stack", stat="identity") 
plot.sum

这不起作用,我得到一个错误:

错误:category_a 列未知

我认为这是因为 R 期望 category_amydt 中的一列,而是从向量“cat1”中获取一个字符项,该向量在 mydt 中不存在 - 如果我错了,请纠正我?

如何解决?

最终目标是把这个变成一个函数:

make.plot.sum <- function (data, group_by1, group_by2, position){

data %>%
  dplyr::group_by(group_by1, group_by2) %>%
  ggplot(aes(x = group_by1, y = N, fill = group_by2)) +
    geom_bar(position="position", stat="identity") 
  plot.sum

  return(plot.sum)

}

make.plot.sum(mydt, category_a, category_b, stack)

【问题讨论】:

  • 你试过aes(x = {{group_by1}}, y = N, fill = {{group_by2}})吗?
  • @teunbrand 我不确定 {{}} 代表什么,但似乎 eit 转换了 group_by1 t 纯文本,但它最初是一个大约 15 个级别的因子
  • 好吧,aes(x = .data[[group_by1]], y = N, fill = .data[[group_by2]])?我认为这篇非标准评估的帖子可以在这里找到:tidyverse.org/blog/2019/06/rlang-0-4-0

标签: r function ggplot2


【解决方案1】:

您是对的:问题可能是由于将字符 "cat1" 传递给 aes(),而 aes() 期望您传递列名(即 cat1 不带任何引号)。如果要将信息作为字符传递给aes(...,可以使用aes_string(...) 代替aes():只要确保在使用aes_string() 时,所有参数都是字符向量,对于aes() ,所有参数都是对数据框中列名的引用。

旁注:我实际上不确定你是否可以结合aes()aes_string(...),以防你想知道......我从未尝试过。所以,你能说aes(x=cat1),然后aes_string(y='cat2')吗?不确定。

【讨论】:

    【解决方案2】:

    chemdorks123s 的答案是一个很好的答案 - 但值得指出的是,aes_string 被认为是软贬低以支持新的成语。

    在您希望用户将列传递给 aes 的情况下,您可以使用大括号 ({{}})。

    make.plot.sum <- function (data, group_by1, group_by2, position){
    
    data %>%
      dplyr::group_by(group_by1, group_by2) %>%
      ggplot(aes(x = {{group_by1}}, y = N, fill = {{group_by2}})) +
        geom_bar(position="position", stat="identity") 
      plot.sum
    
      return(plot.sum)
    
    }
    

    ggplot2 小插图之一中包含更多信息 - Using ggplot2 in packages

    【讨论】:

    • 因为我只是对提出此解决方案的@teunbrand 发表评论(见上文),这就好像因子group_by1 只有一个级别,而实际上它有多个级别
    • 您能否详细说明您希望group_by 做什么?我已经有一段时间没有看了,但我不认为ggplot2 理解由 dplyr 创建的组。它是否像您期望的那样在函数之外工作?如果您想基于因子水平创建多个图,则将分组传递给构面会更有意义
    • @Conoe Neilson 它工作正常,之前我在情节中使用cat1 而不是category_a。一旦我使用 category_a &lt;- cat1 ,我就会收到错误消息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-06
    • 1970-01-01
    • 1970-01-01
    • 2017-11-13
    • 2023-01-25
    • 1970-01-01
    • 2021-04-19
    相关资源
    最近更新 更多