gpt4 book ai didi

r - 无法将用户定义函数中的参数传递给 ggplot

转载 作者:行者123 更新时间:2023-12-04 12:52:32 24 4
gpt4 key购买 nike

我想创建一个用户定义函数,它包含我发现的一些流行的 ggplot 代码。我收到以下错误:

"Error in `[.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 <- 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)
}

我尝试运行的函数如下:

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])

要么:

 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")

或者:

 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")

enter image description here

关于r - 无法将用户定义函数中的参数传递给 ggplot,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23126328/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com