8

以交互方式,此示例运行良好:

p <- ggplot(mtcars, aes(mpg, wt)) + geom_point()
p + facet_grid(. ~ vs)

现在,用公式接口制作一个函数并使用aes_string它来做同样的事情,它不起作用(错误是:)Error in layout_base(data, cols, drop = drop) : At least one layer must contain all variables used for facetting

tf <- function(formula, data) {
res <- as.character(formula[[2]])
fac2 <- as.character(formula[[3]][3])
fac1 <- as.character(formula[[3]][2])

# p <- ggplot(aes_string(x = fac1, y = res), data = data)
# p <- p + geom_point() # original attempt
p <- ggplot() # This is Joran's trick, but it doesn't work here
p <- p + geom_point(aes_string(x = fac1, y = res), data = data)
p <- p + facet_grid(.~fac2) # comment this out, and it works but
# of course is not faceted
}

p <- tf(formula = wt ~ am*vs, data = mtcars)

通过 Joran 的技巧,我在这里指的是,这是我最近发布的一个类似问题。在这种情况下ggplot2,看不到我的分面请求。让它facet_grid(".~fac2")没有效果。建议?我一直被这些事情弄得不知所措。谢谢!

4

2 回答 2

6

您可以使用as.formulapaste

p <- p + facet_grid(as.formula(paste(". ~", fac2)))

在您的示例中,这给出了:

在此处输入图像描述

于 2013-02-07T02:15:22.063 回答
6

我已经用于formula.tools操作公式。

我认为你应该对分面公式有一个单独的论据,否则你将不得不创建自己的解析器来wt ~ am*vs计算分面的含义

像格子分组的想法可能有用

wt~am | vs

但是您必须深入研究 lattice 才能了解它们如何解析公式(看看latticeParseFormula- 复杂!)

更容易将两个公式分开。您可以将字符变量列表作为 rhs 和 lhs 传递facetfacet_grid

我还使用environment = parent.frame()了在我的小型测试中有效的方法

library(formula.tools)

tf <- function(formula, faceting = NULL, data, print = TRUE) {
   y <- rhs(formula)
   x <- lhs(formula)

  p <- ggplot(environment = parent.frame()) 

  p <- p + geom_point(aes_string(x = x, y = y), data = data) 
   if (! is.null(faceting)){
     rhsfacet <- all.vars(rhs(faceting))
     lhsfacet <- all.vars(lhs(faceting))
     if(length(lhsfacet)==1 & any(lhsfacet %in% '.')) {lhsfacet <- NULL}
     if(length(rhsfacet)==1 & any(rhsfacet %in% '.')) {rhsfacet <- NULL}
     p <- p+ facet_grid(facet = list( lhsfacet, rhsfacet))}
  if(print) {print(p)}
  p 

}
tf(wt~mpg, faceting = ~am, data = mtcars, print = TRUE)

在此处输入图像描述

于 2013-02-07T02:35:04.340 回答