无法将用户定义函数中的参数传递给ggplot [英] Unable to Pass Arguments in User Define Function to ggplot
问题描述
我想创建一个用户定义函数,它包含了我发现的一些流行的ggplot代码。我得到以下错误:
$ $ p $ 错误`[.data.frame`(DS,,xvar):object' xcol'not found
下面是一个小的伪数据集来说明问题。
n = 25
dataTest < - data.frame(xcol = sample(1:3,n,replace = TRUE), ycol = rnorm(n,5,2),Cat = letters [1:5])
用户定义的代码如下:
TRIPLOT < - 函数(DS,xvar,yvar,zvar){
#localenv< -environment()
gg< - data.frame(x = DS [,xvar],y = DS [,yvar],fill = DS [,zvar])
empty< - (),
plot.background = panel.grid.minor = element_blank(),
panel.border = element_blank(),
panel.background = element_blank(),
axis.title.x = element_blank(),
axis.title.y = element_blank(),
轴。 text.x = element_blank(),
axis.text.y = element_blank(),
axis.ticks = element_blank())
scatter< -ggplot(gg,aes_string(x = xvar,y = yvar),environment = environment())+
geom_point(aes_string(color = zvar))+
scale_color_manual(values = c(orange,purple))+
主题(legend.position = c(1,1),legend.justification = c(1,1))
plot_top <-ggplot(gg,aes_string(x = xvar,fill = zvar),环境=(环境())+ geom_density(alpha = .5)+ scale_fill_manual(values = c(orange,purple))+ theme(legend.position =none)
plot_right< - ggplot gg,aes_string(yvar,fill = zvar),environment = environment())+ geom_density(alpha = .5)+ coord_flip()+ scale_fill_manual(values = c(orange,purple))+
主题(legend.position =none,axis.title.x = element_blank())
PLT < - grid.arrange(plot_top,empty,scatter,plot_right,ncol = 2,nrow = 2,widths = c(4,1),heights = c(1,4))
print(PLT)
}
我试图运行的函数是以下:
$ $ p $ TRIPLOT(dataTest,xcol,ycol,Cat)
我按照帖子的建议添加了环境参数和data.frame()参数。我也通过引号将参数传递给函数。
感谢您的帮助。
将变量名作为字符串传递给函数, gg
数据框;然后用 aes
来代替 aes_string
;并在调用 ggplot
时使用 gg
数据框及其变量名称。
或者将变量名作为字符串传递给函数;然后使用 aes_string
(并跳过 gg
数据框)。
另外, scale_fill_manual
中的颜色数量有问题。我已经评论了这些线。
library(gridExtra)
library(ggplot2)
n = 25
dataTest = data.frame(
xcol = sample(1:3,n,replace = TRUE),
ycol = rnorm(n,5,2),
Cat = letters [1: 5])
其中:
<$ p $ (x,yvar,zvar){
#localenv< -environment()
gg< - data.frame(x = DS [ ,xvar],y = DS [,yvar],fill = DS [,zvar])
空<-ggplot()+ geom_point(aes(1,1),color =white)+ theme b $ b plot.background = element_blank(),
panel.background = element_blank(),
panel.grid.minor = element_blank(),
panel.border = element_blank(),
panel.background = element_blank(),
axis.title.x = element_blank(),
axis.title.y = element_blank(),
axis.text.x = element_blank (),
axis.text.y = element_blank(),
axis.ticks = element_blank())
scatter< -ggplot(gg,aes(x = x ,y = y))+
geo m_point(aes(color = fill))+
#scale_color_manual(values = c(orange,purple))+
theme(legend.position = c(1,1),legend。 justification = c(1,1))
plot_top< -ggplot(gg,aes(x = x,fill = fill))+
geom_density(alpha = .5)+
#scale_fill_manual(values = c(orange,purple))+
theme(legend.position =none)
plot_right< -ggplot(gg, aes(x = y,fill = fill))+
geom_density(alpha = .5)+ coord_flip()+
#scale_fill_manual(values = c(orange,purple))+
主题(legend.position =none,axis.title.x = element_blank())
PLT <-grid.arrange(plot_top,empty,scatter,plot_right,ncol = 2, (数据测试,xcol= 2,widths = c(4,1),heights = c(1,4))
print(PLT)
}
TRIPLOT ,ycol,Cat)
OR:
TRIPLOT< - 函数(DS,xvar,yvar,zvar){
#localenv< -environment()
#gg< - 数据.frame(x = DS [,xvar],y = DS [,yvar],fill = DS [,zvar])
空< -ggplot()+ geom_point(aes(1,1),color =white)+ theme(
plot.background = element_blank(),
panel.background = element_blank (),
panel.grid.minor = element_blank(),
panel.border = element_blank(),
panel.background = element_blank(),
axis.title.x = element_blank(),
axis.title.y = element_blank(),
axis.text.x = element_blank(),
axis.text.y = element_blank(),
)axis.ticks = element_blank())
scatter< -ggplot(DS,aes_string(x = xvar,y = yvar))+
geom_point(aes_string(color = zvar)) +
#scale_color_manual(values = c(orange,purple))+
theme(legend.position = c(1,1),legend.justification = c(1,1))
plot_top< -ggplot(DS,aes_string(x = xvar,fill = zvar))+
geom_density(alpha = .5)+
#scale_fill_manual(values = c (orange,purple))+
theme(legend.position =none)
plot_right< -ggplot(DS,aes_string(x = yvar,f ()= +
geom_density(alpha = .5)+ coord_flip()+
#scale_fill_manual(values = c(orange,purple))+
theme .position =none,axis.title.x = element_blank())
PLT <-grid.arrange(plot_top,empty,scatter,plot_right,ncol = 2,nrow = 2,widths = c(4,1),heights = c(1,4))
print(PLT)
}
TRIPLOT(dataTest,xcol,ycol, Cat)
I want to create a user define function that wraps around some popular ggplot code I found. I am getting the following error:
"Error in `[.data.frame`(DS, , xvar) : object 'xcol' not found"
The following is a small pseudo dataset to illustrate the issue.
n=25
dataTest <- data.frame(xcol=sample(1:3, n, replace=TRUE), ycol = rnorm(n, 5, 2), Cat=letters[1:5])
The user defined code is as here:
TRIPLOT <- function (DS,xvar,yvar,zvar) {
#localenv<-environment()
gg <- data.frame(x=DS[,xvar],y=DS[,yvar],fill=DS[,zvar])
empty<-ggplot()+geom_point(aes(1,1),colour="white") + theme(
plot.background = element_blank(),
panel.background = element_blank(),
panel.grid.minor = element_blank(),
panel.border = element_blank(),
panel.background = element_blank(),
axis.title.x = element_blank(),
axis.title.y = element_blank(),
axis.text.x = element_blank(),
axis.text.y = element_blank(),
axis.ticks = element_blank())
scatter <-ggplot(gg, aes_string(x=xvar,y=yvar), environment=environment())+
geom_point(aes_string(color=zvar))+
scale_color_manual(values=c("orange","purple"))+
theme(legend.position=c(1,1), legend.justification=c(1,1))
plot_top <- ggplot(gg,aes_string(x=xvar, fill=zvar), environment=environment())+geom_density(alpha=.5)+scale_fill_manual(values=c("orange","purple"))+theme(legend.position="none")
plot_right <- ggplot(gg, aes_string(yvar, fill=zvar),environment=environment())+geom_density(alpha=.5)+coord_flip()+ scale_fill_manual(values=c("orange","purple"))+
theme(legend.position="none", axis.title.x=element_blank())
PLT <- grid.arrange(plot_top,empty,scatter,plot_right, ncol=2,nrow=2,widths=c(4,1), heights=c(1,4))
print(PLT)
}
The function I am trying to run is the following:
TRIPLOT(dataTest,"xcol","ycol","Cat")
I added environment argument and the data.frame() argument as recommend by the post. I have also passed the arguments to the function in quotes. Thank you for any help.
Either pass the variable names as strings to the function, rename the variables in gg
data frame; then use aes
in place of aes_string
; and use the gg
data frame and its variable names in the calls to ggplot
.
Or pass the variable names as strings to the function; then use aes_string
(and skip the gg
data frame).
In addition there is a problem with the number of colours in scale_fill_manual
. I've commented those lines out.
library(gridExtra)
library(ggplot2)
n=25
dataTest = data.frame(
xcol=sample(1:3, n, replace=TRUE),
ycol = rnorm(n, 5, 2),
Cat=letters[1:5])
EITHER:
TRIPLOT <- function (DS,xvar,yvar,zvar) {
#localenv<-environment()
gg <- data.frame(x = DS[,xvar], y = DS[, yvar],fill = DS[,zvar])
empty<-ggplot()+geom_point(aes(1,1),colour="white") + theme(
plot.background = element_blank(),
panel.background = element_blank(),
panel.grid.minor = element_blank(),
panel.border = element_blank(),
panel.background = element_blank(),
axis.title.x = element_blank(),
axis.title.y = element_blank(),
axis.text.x = element_blank(),
axis.text.y = element_blank(),
axis.ticks = element_blank())
scatter <-ggplot(gg, aes(x = x,y = y))+
geom_point(aes(color = fill))+
#scale_color_manual(values=c("orange","purple"))+
theme(legend.position=c(1,1), legend.justification=c(1,1))
plot_top <-ggplot(gg,aes(x = x, fill = fill))+
geom_density(alpha=.5)+
#scale_fill_manual(values=c("orange","purple"))+
theme(legend.position="none")
plot_right <-ggplot(gg, aes(x = y, fill = fill))+
geom_density(alpha=.5)+coord_flip()+
#scale_fill_manual(values=c("orange","purple"))+
theme(legend.position="none", axis.title.x=element_blank())
PLT<-grid.arrange(plot_top,empty,scatter,plot_right, ncol=2,nrow=2,widths=c(4,1), heights=c(1,4))
print(PLT)
}
TRIPLOT(dataTest,"xcol","ycol","Cat")
OR:
TRIPLOT <- function (DS,xvar,yvar,zvar) {
#localenv<-environment()
#gg <- data.frame(x = DS[,xvar], y = DS[, yvar],fill = DS[,zvar])
empty<-ggplot()+geom_point(aes(1,1),colour="white") + theme(
plot.background = element_blank(),
panel.background = element_blank(),
panel.grid.minor = element_blank(),
panel.border = element_blank(),
panel.background = element_blank(),
axis.title.x = element_blank(),
axis.title.y = element_blank(),
axis.text.x = element_blank(),
axis.text.y = element_blank(),
axis.ticks = element_blank())
scatter <-ggplot(DS, aes_string(x = xvar,y = yvar))+
geom_point(aes_string(color = zvar))+
#scale_color_manual(values=c("orange","purple"))+
theme(legend.position=c(1,1), legend.justification=c(1,1))
plot_top <-ggplot(DS,aes_string(x = xvar, fill = zvar))+
geom_density(alpha=.5)+
#scale_fill_manual(values=c("orange","purple"))+
theme(legend.position="none")
plot_right <-ggplot(DS, aes_string(x = yvar, fill = zvar))+
geom_density(alpha=.5)+coord_flip()+
#scale_fill_manual(values=c("orange","purple"))+
theme(legend.position="none", axis.title.x=element_blank())
PLT<-grid.arrange(plot_top,empty,scatter,plot_right, ncol=2,nrow=2,widths=c(4,1), heights=c(1,4))
print(PLT)
}
TRIPLOT(dataTest,"xcol","ycol","Cat")
这篇关于无法将用户定义函数中的参数传递给ggplot的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!