函数中的ggplot:找不到变量

ggplot in a function: variable not found

我在尝试创建函数以使用 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)

在查找类似问题时,我发现指定本地环境应该可以解决问题。但是,它对我的​​情况没有帮助。

谢谢

我已经在策划一些事情了,如果这不是预期的输出,请告诉我。

我为使其正常工作而对代码所做的更改是:

  • 加载 ggplot2 库
  • 从对 wg 的 geom_errorbar 调用中删除 d$,因为它们是函数参数而不是 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)

初步说明

当查看您的 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 首先没有抱怨。如果您在创建 data.frame 后立即在原始代码中添加了 rm(x1, x2, y1),您会更早地看到问题。

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

然而,使用这种方法,您无法在现场进行计算,因此您需要事先在 data.frame 中创建变量 yminymax。此外,如果每个 geom 与 ggplot.

提供的参数相同,则无需为每个 geom 提供数据参数