在具有facet和多个geoms的函数中使用ggplot

时间:2015-11-05 06:14:37

标签: r function ggplot2 nse

我正在尝试编写一个使用ggplot的函数,但允许用户指定几个绘图变量。但是我无法将其作为一个函数工作(收到错误消息:见下文)。

下面提供了一个小示例数据集和工作实现,以及我对函数和相关错误的尝试。我确定它与非标准评估(NSE)有关,但我不确定如何在函数中使用过滤器来解决它,而且我的各种尝试都是徒劳的。

library(dplyr)
library(ggplot2)

df<-data.frame(Date=c(seq(1:50),seq(1:50)), SRI=runif(100,-2,2), SITE=(c(rep("A",50), rep("B", 50))))

ggplot() +
geom_linerange(aes(x = Date, ymin = 0, ymax = SRI), colour = I('blue'), data = filter(df, SRI>0)) +
geom_linerange(aes(x = Date, ymin = SRI, ymax = 0), colour = I('red'), data = filter(df, SRI<=0)) +
facet_wrap(~SITE) +
labs(x = 'Date', y = "yvar", title = "Plot title")

以上是有效的,但是当作为函数实现时:

plot_fun <- function(df, x, y, ylab="y-lab", plot_title="Title", facets) {
ggplot() +
geom_linerange(aes(x = x, ymin = 0, ymax = y), colour = I('blue'), data = filter(df, y > 0)) +
geom_linerange(aes(x = x, ymin = y, ymax = 0), colour = I('red'), data = filter(df, y <= 0)) +
facet_wrap(~ facets) +
labs(x = 'Date', y = ylab, title = plot_title)
return(p)
}

plot_fun(df, x="Date", y="SRI", ylab="y-lab", plot_title="Title", facets="SITE")

我得到以下“错误:美学必须是长度1或与数据(1)相同:x,ymin,max”。

我尝试过使用as_stringfilter_的各种方法,但都没有成功。

任何帮助都非常感激。

此致

尼克

1 个答案:

答案 0 :(得分:2)

您需要按预期切换到aes_string,并更改facet_wrap代码,将facets参数作为公式或删除代字号{ {3}}。您还需要切换为使用filter_interp可以与包 lazyeval 中的library(lazyeval) 一起使用。

plot_fun <- function(df, x, y, ylab = "y-lab", plot_title = "Title", facets) {
    ggplot() +
        geom_linerange(aes_string(x = x, ymin = 0, ymax = y), colour = I('blue'), 
                    data = filter_(df, interp(~var > 0, var = as.name(y)))) +
        geom_linerange(aes_string(x = x, ymin = y, ymax = 0), colour = I('red'), 
                    data = filter_(df, interp(~var <= 0, var = as.name(y)))) +
        facet_wrap(facets) +
        labs(x = 'Date', y = ylab, title = plot_title)
}

plot_fun(df, x="Date", y="SRI", facets="SITE")

这是您的功能,包括我概述的更改和结果图:

Uncaught SyntaxError: Unexpected token <

answers to this question