2015-05-15 66 views
4

我是从MatLab切换过来的R/ggplot新手。R + ggplot:geom_txt标签不能识别函数调用中的变量

我想创建一个函数使用ggplot与线性回归方程打印在图上(这在Adding Regression Line Equation and R2 on graph讨论)。但在这里,我试图用它来构建一个功能,但并不成功。

我一直得到一个错误 - “eval(expr,envir,enclos):object'label'not found”错误。

一个解决方法是定义“标签”变量的功能以外,但我不明白为什么这不起作用。

任何人都可以解释为什么吗?

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 

回答

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

大约有代码的一些修正:

  • 您使用的是geom_text的数据是您在ggplot()定义相同,除非你改变它。在这里,我为此创建了一个临时data.frame,称为label.df
  • xlim()ylim()功能过滤了大部分数据点,因为xy的范围远远大于您在原始代码中定义的限制。
  • 如果要传递用于显示图形的data.frame列的名称,将字符串传递起来更容易(即"x")。这样,aes()功能也变为aes_string()

下面是结果: enter image description here

编辑 由于@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) 
} 
+0

你能解释一下是什么问题? – Soheil

+6

我推荐'annotate(geom =“text”,...)'而不是'geom_text'。避免创建新数据框的麻烦。 – Gregor

+0

另外,您不需要在函数中传递x和y。您只需传递数据帧,ggplot从DS获取x和y。 – eipi10