函数中的ggplot:未找到变量

时间:2015-06-23 06:41:05

标签: r data-visualization ggplot2

我尝试创建一个使用ggplot创建绘图的函数时遇到问题。这是一些代码:

y1<- sample(1:30,45,replace = T)
x1 <- rep(rep(c("a1","a2","a3","a4","a5"),3),each=3)
x2 <- rep(rep(c("b1","b2","b3","b4","b5"),3),each=3)
df <- data.frame(y1,x1,x2)
library(Rmisc)
dfsum <- summarySE(data=df, measurevar="y1",groupvars=c("x1","x2"))
myplot <- function(d,v, w,g) {
  pd <- position_dodge(.1)
  localenv <- environment()
  ggplot(data=d, aes(x=v,y=w,group=g),environment = localenv) + 
  geom_errorbar(data=d,aes(ymin=d$w-d$se, ymax=d$w+d$se,col=d$g), width=.4, position=pd,environment = localenv) +
  geom_line(position=pd,linetype="dotted") +
  geom_point(data=d,position=pd,aes(col=g))
}
myplot(dfsum,x1,y1,x2)

在我寻找类似问题时,我发现指定本地环境应该可以解决问题。然而,在我的情况下它没有帮助。

谢谢

2 个答案:

答案 0 :(得分:0)

我已经绘制了一些内容,如果这不是预期的输出,请告诉我。

plot

我对代码所做的更改是:

  • 加载ggplot2库
  • 从geom_errorbar调用d$w中移除g,因为它们是函数参数而不是d中的列。

我还删除了除主data=d之外的所有图层的ggplot来电,因为这些都不是必需的。

library(ggplot2)
myplot <- function(d,v, w,g) {
  pd <- position_dodge(.1)
  localenv <- environment()
  ggplot(data=d, aes(x=v,y=w,group=g),environment = localenv) +
    geom_errorbar(aes(ymin=w-se, ymax=w+se,col=g), width=.4,
              position=pd,environment = localenv) +
    geom_line(position=pd,linetype="dotted") +
    geom_point(position=pd,aes(col=g))
}
myplot(dfsum,x1,y1,x2)

答案 1 :(得分:0)

初步说明

在查看data.frame时,group变量没有任何意义,因为它与x变量完全混淆。因此,我对您的数据进行了一些调整,以显示完整的示例:

数据

library(Rmisc)
library(ggplot2)
d <- expand.grid(x1 = paste0("a", 1:5),
                 x2 = paste0("b", 1:5))
d <- d[rep(1:NROW(d), each = 3), ]
d$y1 <- rnorm(NROW(d))
dfsum <- summarySE(d, measurevar = "y1", groupvars = paste0("x", 1:2))

绘图功能

myplot <- function(mydat, xvar, yvar, grpvar) {
   mydat$ymin <- mydat[[yvar]] - mydat$se
   mydat$ymax <- mydat[[yvar]] + mydat$se
   pd <- position_dodge(width = .5)
   ggplot(mydat, aes_string(x = xvar, y = yvar, group = grpvar,
                            ymin = "ymin", ymax = "ymax", color = grpvar)) +
      geom_errorbar(width = .4, position = pd) +
      geom_point(position = pd) + 
      geom_line(position = pd, linetype = "dashed")
}
myplot(dfsum, "x1", "y1", "x2")

<强>解释

出现问题是因为x1 x2y1的范围不明确。正如您在顶级环境中定义这些变量一样,R首先没有抱怨。如果您在创建rm(x1, x2, y1)后立即在原始代码中添加了data.frame,那么您会发现问题已经过时了。

ggplot查看您提供的data.frame所有要映射到某些美学的变量。如果要创建一个函数,在其中指定aesthatics的名称作为参数,则应使用aes_string而不是aes,因为前者需要一个字符串给出变量的名称而不是变量本身。

但是,使用这种方法,您无法在现场进行计算,因此您需要事先在ymin中创建变量ymaxdata.frame。此外,如果每个geom与ggplot提供的参数相同,则无需为每个geom提供数据参数。