JJ *_*hin 4 label r function ggplot2 lm
我是来自MatLab的R/ggplot新手.
我想使用ggplot创建一个函数,在图上打印线性回归方程(在图中 添加回归线方程和R2中讨论).但是在这里,我试图用它来构建一个函数但是没有成功.
我一直收到错误 - "eval中的错误(expr,envir,enclos):找不到对象'标签'".
一种解决方法是在函数之外定义"label"变量,但我只是不明白为什么这不起作用.
有谁能解释为什么?
df <- data.frame(x = c(1:100))
df$y <- 2 + 3 * df$x + rnorm(100, sd = 40)
f <- function(DS, x, y, z) {
label <- z
print(label)
ggplot(DS, aes(x=x, y=y)) +
geom_point() +
labs(y=y) +
labs(title=y) +
xlim(0,5)+
ylim(0,5)+
geom_smooth(method="lm", se=FALSE)+
geom_text (aes(x=1, y=4, label=label))
}
f(df, x, y, "aaa") #execution line
Run Code Online (Sandbox Code Playgroud)
请参阅以下代码:
library(ggplot2)
df <- data.frame(x = c(1:100))
df$y <- 2 + 3 * df$x + rnorm(100, sd = 40)
f <- function(DS, x, y, z) {
label.df = data.frame(x=1, y=4, label=z)
ggplot(DS, aes_string(x=x, y=y)) +
geom_point() +
labs(y=y) +
labs(title=y) +
geom_smooth(method="lm", se=FALSE)+
geom_text (aes(x=x, y=y, label=label), label.df)
}
f(df, "x", "y", "aaa")
Run Code Online (Sandbox Code Playgroud)
您的代码有一些修复:
geom_text,ggplot()否则您使用的数据与您定义的数据相同.在这里,我data.frame为此目的创建了一个临时名称label.df.xlim()和ylim()函数正在过滤大多数数据点,因为它们的范围x和y远大于您在原始代码中定义的限制.data.frame用于显示图形的列的名称时,将它们的名称作为字符串传递会更容易(即"x").这样,aes()函数也改为aes_string().结果如下:

编辑 感谢@Gregor,更简单的版本是:
f <- function(DS, x, y, z) {
ggplot(DS, aes_string(x=x, y=y)) +
geom_point() +
labs(y=y) +
labs(title=y) +
geom_smooth(method="lm", se=FALSE)+
annotate(geom="text", x=1, y=4, label=z)
}
Run Code Online (Sandbox Code Playgroud)