我将直接跳到一个示例并评论后记:
cont <- data.frame(value = c(1:20),variable = c(1:20,(1:20)^1.5,(1:20)^2),group=rep(c(1,2,3),each=20))
value variable group
1 1 1.000000 1
2 2 2.000000 1
3 3 3.000000 1
#... etc.
#ser is shorthand for "series".
plot_scat <- function(data,x,y,ser) {
ggplot(data,aes(x=x,y=y,color=factor(ser)))+geom_point()
}
plot_scat(cont,value,variable,group)
#This gives the error:
#Error in eval(expr,envir,enclose) : object 'x' not found
现在,我知道 ggplot2 有一个已知错误,其中 aes() 只会在全局环境中查看,而不是在本地环境中查看。遵循以下建议:在 R 的另一个函数中使用 ggplot(),我尝试了另一条路线。
plot_scat <- function(data,x,y,ser) {
#environment=environment() added
ggplot(data,aes(x=x,y=y,color=factor(ser)),environment=environment())+geom_point()
}
plot_scat(cont,value,variable,group)
#This gives the error:
#Error in eval(expr,envir,enclos) : object 'value' not found
#In addition: Warning message:
#In eval(expr,envir,enclos) : restarting interrupted promise evaluation
我不知道最后一行是什么意思。如果我打电话:ggplot(cont,aes(x=value,y=variable,color=group))+geom_point()
我得到了你期望的图表。在命令行中,aes() 正在 ggplot() 中查找变量名称,但它不在函数调用中执行此操作。所以我试图改变我的电话:
plot_scat(cont,cont$value,cont$variable,cont$group)
这让我得到了我想要的。所以我添加了下一层复杂性:
plot_scat <- function(data,x,y,ser) {
#added facet_grid
ggplot(data,aes(x=x,y=y,color=factor(ser)),environment=environment())+geom_point()+
facet_grid(.~ser)
}
plot_scat(cont,cont$value,cont$variable,cont$group)
#This gives the error:
#Error in layout_base(data, cols, drop = drop):
# At least one layer must contain all variables used for facetting
我对此的想法是 ser 实际上是 cont$group,它可以在 aes() 中使用,但是当传递给 facet_grid 现在是一个单列数据框,没有关于值和变量的信息。根据帮助页面, facet_grid 不采用“data =”参数,所以我不能使用 facet_grid(data=data,.~ser) 来解决这个问题。我不知道如何从这里开始。
这是一个非常简单的例子,但长期目标是有一个功能,我可以在我的办公室里给非 R 识字的人说“给它你的数据框名称,列名和你想要拆分的列它会为你制作漂亮的情节”。它也会变得更加复杂,具有非常定制的主题,这与我遇到的问题无关。