以下效果很好(我得到了正确的图表):
library(ggplot2)
myfunc <- function(x)
{
n = length(x)
return(sqrt(x)+rnorm(n,0,0.05))
}
myplot1 <- function(df,x,color)
{
df$y <- myfunc(df[[x]])
p <- geom_point(data=df,
aes_string(x=x,y="y"),
colour=color)
return(p)
}
myplot2 <- function(df,x,color)
{
df$y <- myfunc(df[[x]])
p <- geom_smooth(data=df,
aes_string(x=x,y="y"),
colour=color,
method="lm")
return(p)
}
n <- 100
df <- data.frame( X1 = runif(n,0,1),
X2 = rnorm(n,0.5,0.01))
p <- ggplot()
p <- p + myplot1(df,"X1","black") + myplot2(df,"X1","black")
p <- p + myplot1(df,"X2","blue") + myplot2(df,"X2","blue")
p + theme_minimal()
但是,如果我将两个函数myplot1和myplot2合并为
myplot <- function(df,x,color)
{
df$y <- myfunc(df[[x]])
p <- geom_point(data=df,
aes_string(x=x,y="y"),
colour=color) +
geom_smooth(data=df,
aes_string(x=x,y="y"),
colour=color,
method="lm")
return(p)
}
所以使用
p <- ggplot()
p <- p + myplot(df,"X1","black")
p <- p + myplot(df,"X2","blue")
p + theme_minimal()
我得到了
错误[...]二元运算符的非数字参数
我该如何解决这个问题?
答案 0 :(得分:1)
由于某种原因,组合这些geoms会导致问题。您可以将它们作为列表返回并使其工作:
library(ggplot2)
n <- 100
df <- data.frame( X1 = runif(n,0,1),
X2 = rnorm(n,0.5,0.01))
myfunc <- function(x)
{
n = length(x)
return(sqrt(x)+rnorm(n,0,0.05))
}
myplot <- function(mydata,x,color)
{
mydata$y <- myfunc(mydata[[x]])
p <- geom_point(data = mydata, aes_string(x = x, y = 'y'), color = color)
q <- geom_smooth(data = mydata, aes_string(x = x, y = 'y'), color = color, method = 'lm')
return(list(p, q))
}
p <- ggplot()
p <- p + myplot(df,"X1","black")
p <- p + myplot(df,"X2","blue")
p + theme_minimal()