2015-05-15 64 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