2015-05-13 39 views
2

下面的函數計算binned平均值,相對於每個bin中的觀察值數量來確定圖表上的bin點的大小,並繪製通過bin平均值的lowess線。然而,我不想通過bin的方式繪製lowess線,而是想通過原始數據集繪製直線,以便lowess線上的誤差帶表示實際數據集中的不確定性,而不是分級平均值中的不確定性。如何修改geom_smooth()以便它將使用df而不是dfplot來繪製線條?ggplot黃土線從一個數據集在另一個散點圖

library(fields) 
library(ggplot2) 

binplot <- function(df, yvar, xvar, sub = FALSE, N = 50, size = 40, xlabel = "X", ylabel = "Y"){ 
    if(sub != FALSE){ 
    df <- subset(df, eval(parse(text = sub))) 

    } 

    out <- stats.bin(df[,xvar], df[,yvar], N= N) 
    x <- out$centers 
    y <- out$stats[ c("mean"),] 
    n <- out$stats[ c("N"),] 
    dfplot <- as.data.frame(cbind(x,y,n)) 

    if(size != FALSE){ 
    sizes <- n * (size/max(n)) 

    }else{ 
    sizes = 3 
    } 

    ggplot(dfplot, aes(x,y)) + 
     xlab(xlabel) + 
     ylab(ylabel) + 
     geom_point(shape=1, size = sizes) + 
     geom_smooth() 
} 

下面是展示功能目前是如何工作的一個重複的例子:

sampleSize <- 10000 
x1 <- rnorm(n=sampleSize, mean = 0, sd = 4) 
y1 <- x1 * 2 + x1^2 * .3 + rnorm(n=sampleSize, mean = 5, sd = 10) 
binplot(data.frame(x1,y1), "y1", "x1", N = 25) 

enter image description here

正如你所看到的,在LOWESS線的誤差範圍反映如果每個面的不確定性有相同數量的觀察,但他們沒有。在極端情況下,箱子的觀察數量要少得多(如點的大小所示),而低緯線的誤差帶應該反映這一點。

+2

'?geom_smooth',第二個參數是'data'。你有沒有試過指定'data = df'? – Gregor

+1

請使用示例輸入數據製作[可重現示例](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example),以便我們可以運行代碼。 – MrFlick

+0

@Gregor在eval(expr,envir,enclos)中產生錯誤:object'x'not found'我看過了?geom_smooth和?ggplot頁面。這可能是一個完全noob的問題,似乎應該是直截了當的,但我無法弄清楚它 – Michael

回答

2

您可以明確設置每個圖層的data=參數。由於原始data.frame具有不同的列名稱,因此您還需要更改審美映射。只要改變你的geom_smooth呼叫

geom_smooth(data=df, aes_string(xvar, yvar)) 

與樣本數據,這回

enter image description here

相關問題