【发布时间】:2013-01-22 10:21:12
【问题描述】:
以交互方式,此示例运行良好:
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 的技巧,我参考了 here,这是我最近发布的一个类似问题。在这种情况下,ggplot2没有看到我的分面请求。使其facet_grid(".~fac2") 无效。建议?我一直被这些事情弄得不知所措。谢谢!
【问题讨论】:
-
fac2的示例值是什么? (它只是一个向量,还是一个更复杂的公式?) -
fac2就像fac1一样,是一个字符串,它给出了一个数据框列的名称,它是一个因素或强制因素。它是可重现的,使用mtcars查看最后一行。 -
我认为将分面公式作为第二个参数会容易得多,否则您将不得不构建一个新的解析器,但是您希望区分分面变量和坐标变量
-
@mnel,不完全确定您的意思 - 将刻面移到哪里?
-
看我的回答。希望现在更有意义。