R + ggplot:geom_txt标签无法识别函数调用中的变量

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)

Ali*_*Ali 5

请参阅以下代码:

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)

  • 我建议`annotate(geom ="text",...)`而不是`geom_text`.避免创建新数据框的麻烦. (6认同)