在基于ggplot2的绘图功能中创建构面时出错

时间:2015-09-13 19:35:06

标签: r function plot ggplot2

所以我正在尝试为现有的R包开发基于ggplot2的绘图功能。用户应该能够指定一个数据框(datfile),一个垂直线放置在图(alpha)中的值,以及一个用于通过多面创建子图的分组变量(组)。

以下是一些示例数据:

#Some hypothetical data
Computed=c(0.03, 0.25, 0.74, 0.02, 0.0023, 0.43, 0.56, 0.32, 0.005, 0.0032, 0.06)
Reported.P.Value=c(0.25, 0.24, 0.74, 0.01, 0.001, 0.40, 0.56, 0.32, 0.003, 0.0032, 0.02)
Journal=c("a", "b","a", "b","a", "b","a", "b","a", "b","a")

dat=data.frame(Computed, Reported.P.Value, Journal)

该功能如下所示:

plot1 <- function(datfile, alpha, group){

p <- ggplot(datfile, aes(y = Computed,x = Reported.P.Value))   

p + geom_point(size=2.5)+
  geom_vline(xintercept=alpha, color="grey60",linetype="dashed")+
  geom_abline(intercept=0, slope=1, color="grey60")+
  annotate("text", x= 0.5, y = .10, label="overestimated")+
  annotate("text", x= 0.5, y = .90, label="underestimated")+
  scale_x_continuous(name="Reported p-values", breaks=c(0.00, 0.05, 0.10, 0.25, 0.50, 0.75, 1.0))+
  scale_y_continuous(name="Computed p-values", breaks=c(0.00, 0.05, 0.10, 0.25, 0.50, 0.75, 1.0))+
  facet_grid(group ~ .)
 }

如果我忽略了这个函数,并且只是自己执行绘图代码(用数据框中的适当向量代替),一切都很好:enter image description here

但如果尝试运行该功能,则绘图功能本身......:

plot1(dat, 0.05, Journal)

我收到此错误消息: Error in layout_base(data, rows, drop = drop) : At least one layer must contain all variables used for faceting

我的错误似乎与所讨论的问题here有关,其中接受的答案的作者写道:

  

facet_grid是更具体的必需名称,甚至不是其功能。

这是否意味着我无法将数据框中的变量传递给函数中的分面选项?我的编程背景并不是很棒,如果我的函数用户无法指定一个faceting变量,那将是一个真正的无聊。非常感谢任何帮助!

1 个答案:

答案 0 :(得分:3)

原始代码的两处更改:使用facet_grid将facetting语句传递给paste以构造相应的字符串(根据@ aosmith的注释,不需要公式包装),然后传递facet变量将函数作为字符串。

plot1 <- function(datfile, alpha, group){

  p <- ggplot(datfile, aes(y = Computed,x = Reported.P.Value))   

  p + geom_point(size=2.5)+
    geom_vline(xintercept=alpha, color="grey60",linetype="dashed")+
    geom_abline(intercept=0, slope=1, color="grey60")+
    annotate("text", x= 0.5, y = .10, label="overestimated")+
    annotate("text", x= 0.5, y = .90, label="underestimated")+
    scale_x_continuous(name="Reported p-values", breaks=c(0.00, 0.05, 0.10, 0.25, 0.50, 0.75, 1.0))+
    scale_y_continuous(name="Computed p-values", breaks=c(0.00, 0.05, 0.10, 0.25, 0.50, 0.75, 1.0))+
    facet_grid(paste(group, "~ ."))
}

plot1(dat, 0.5, "Journal")