我尝试创建一个使用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)
在我寻找类似问题时,我发现指定本地环境应该可以解决问题。然而,在我的情况下它没有帮助。
谢谢
答案 0 :(得分:0)
我已经绘制了一些内容,如果这不是预期的输出,请告诉我。
我对代码所做的更改是:
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
x2
和y1
的范围不明确。正如您在顶级环境中定义这些变量一样,R
首先没有抱怨。如果您在创建rm(x1, x2, y1)
后立即在原始代码中添加了data.frame
,那么您会发现问题已经过时了。
ggplot
查看您提供的data.frame
所有要映射到某些美学的变量。如果要创建一个函数,在其中指定aesthatics的名称作为参数,则应使用aes_string
而不是aes
,因为前者需要一个字符串给出变量的名称而不是变量本身。
但是,使用这种方法,您无法在现场进行计算,因此您需要事先在ymin
中创建变量ymax
和data.frame
。此外,如果每个geom与ggplot
提供的参数相同,则无需为每个geom提供数据参数。