函数中的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 库
- 从对
w
和 g
的 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
x2
和 y1
的范围不明确。当您也在顶级环境中定义这些变量时,R
首先没有抱怨。如果您在创建 data.frame
后立即在原始代码中添加了 rm(x1, x2, y1)
,您会更早地看到问题。
ggplot
在您提供的 data.frame
中查找要映射到特定美学的所有变量。如果你想创建一个函数,在其中指定美学的名称作为参数,你应该使用 aes_string
而不是 aes
,因为前者期望一个字符串给出变量的名称而不是变量本身。
然而,使用这种方法,您无法在现场进行计算,因此您需要事先在 data.frame
中创建变量 ymin
和 ymax
。此外,如果每个 geom 与 ggplot
.
提供的参数相同,则无需为每个 geom 提供数据参数
我在尝试创建函数以使用 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 库
- 从对
w
和g
的 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
x2
和 y1
的范围不明确。当您也在顶级环境中定义这些变量时,R
首先没有抱怨。如果您在创建 data.frame
后立即在原始代码中添加了 rm(x1, x2, y1)
,您会更早地看到问题。
ggplot
在您提供的 data.frame
中查找要映射到特定美学的所有变量。如果你想创建一个函数,在其中指定美学的名称作为参数,你应该使用 aes_string
而不是 aes
,因为前者期望一个字符串给出变量的名称而不是变量本身。
然而,使用这种方法,您无法在现场进行计算,因此您需要事先在 data.frame
中创建变量 ymin
和 ymax
。此外,如果每个 geom 与 ggplot
.