【问题标题】:ggplot iterate several columnsggplot 迭代几列
【发布时间】:2014-11-07 16:34:13
【问题描述】:
  lapply(7:12, function(x) ggplot(mydf)+geom_histogram(aes(mydf[,x])))

会报错Error in [.data.frame(mydf, , x) : undefined columns selected

我使用了几个 SO 问题(例如 this)作为指导,但无法弄清楚我的错误。

【问题讨论】:

  • 问题是ggplotaes() 内部调用时并不知道x
  • 想想这些变量的范围。 X 在 aes() 内,在 ggplot() 内,在 function() 内。
  • @ahburr 不,aes 稍后会在 x 超出范围时进行评估。
  • 你应该在这里使用aes_string(x)而不是aes(mydf[,x])。请阅读差异。
  • "当您在 aes() 中调用 x 时,ggplot 不知道 x" - 这意味着存在范围问题。在编写这些具有多个交互/相互之间的函数的 R 代码行时,了解变量的范围通常被忽视并且容易混淆。我认为作者@koenbro 从范围方面考虑这个问题可能会学到很多东西。

标签: r ggplot2 apply lapply


【解决方案1】:

下面的代码适用于mtcars 数据集。只需将mtcars 替换为mydf

library(ggplot2)
lapply(1:3,function(i) {
  ggplot(data.frame(x=mtcars[,i]))+
    geom_histogram(aes(x=x))+
    ggtitle(names(mtcars)[i])
  })

注意对i(列索引)的引用是如何从mapping 参数(对aes(...) 的调用)移动到data 参数的。

你的问题其实很微妙。 ggplot 首先在您的数据上下文中评估 aes(...) 的参数 - 例如它在mydf 中查找列名。如果失败,它会跳转到全局环境。它不查看函数的环境。有关此行为的另一个示例和一些讨论,请参阅 this post

底线是在调用aes(...) 时使用外部变量是一个非常糟糕的主意。但是,data=... 参数不会因此受到影响。如果您必须引用列号等,请在对ggplot(data=...) 的调用中进行。

【讨论】:

    猜你喜欢
    • 2021-08-26
    • 2016-11-12
    • 1970-01-01
    • 2017-12-08
    • 2013-12-17
    • 1970-01-01
    • 2021-07-07
    • 1970-01-01
    • 2022-01-12
    相关资源
    最近更新 更多