【问题标题】:Metaprogramming with ggplot2使用 ggplot2 进行元编程
【发布时间】:2013-10-01 16:47:24
【问题描述】:

我一直在努力减少制作大量功能/数据切片略有不同的图表所需的复制和粘贴量。

这是我正在尝试做的一个简化示例:

test <- data.table(a=c("x","y"), b=seq(1,3), c=rnorm(18))

fixedSlices <- function(input, rowfacet, colfacet, metric){
  calc <- substitute(metric)
  bygroup<-c(rowfacet,colfacet)
  aggregates <- input[,eval(calc),by=bygroup]

  ggplot(aggregates) + geom_point(stat="identity") + aes(x="", y=V1) + facet_grid(a ~ b)
}
fixedSlices(test, "a", "b", mean(c)) #works

dynamicSlices <- function(input, rowfacet, colfacet, metric){
  calc <- substitute(metric)
  bygroup<-c(rowfacet,colfacet)
  aggregates <- input[,eval(calc),by=bygroup]

  ggplot(aggregates) + geom_point(stat="identity") + aes(x="", y=V1) + facet_grid(eval(rowfacet) ~ eval(colfacet))
}
dynamicSlices(test, "a", "b", mean(c))
#Error in layout_base(data, rows, drop = drop) : At least one layer must contain all variables used for facetting

我希望能够让我的函数接受要分面的变量作为参数。我能够让它在按 data.table 中的列分组方面起作用,但不能在 ggplot 中按它们分面。

【问题讨论】:

  • 这里不应该用aes_string代替aes吗?

标签: r ggplot2 data.table


【解决方案1】:

你应该使用

... + facet_grid(as.formula(sprintf("%s ~ %s", rowfacet, colfacet))

在您的代码中。

【讨论】:

    【解决方案2】:

    facet_grid() 接受一个公式对象,您可以使用as.formula() 从字符串创建公式对象。因此,您应该能够执行以下操作:

     facet_grid(as.formula(paste(rowfacet, "~", colfacet)))
    

    【讨论】:

      猜你喜欢
      • 2023-03-08
      • 1970-01-01
      • 2011-06-28
      • 2017-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-16
      • 2020-03-20
      相关资源
      最近更新 更多