2015-10-15 166 views
1

平均假設我有一個數據幀,看起來像這樣:ggplot:繪製在x軸上的垃圾箱和y軸

data <- data.frame(y = rnorm(10,0,1), x = runif(10,0,1)) 

我想要做的是削減x值成箱,如:

data$bins <- cut(data$x,breaks = 4) 

然後,我想的方式,x軸是倉(使用ggplot)的結果來繪製,並且y軸是數據$ y的數據點的平均值落入相應的垃圾箱。

預先感謝您

+0

我看到你的問題問切值,然後繪製平均值。使用象''tmp < - hist(data.x,breaks =「Sturges」)這樣的'hist'函數中的標準算法來尋找箱子,然後使用類似'idxs = findInterval(data.x) ,tmp $ break)'。然後使用ggplot中的x座標索引:'tmp $ mids [idxs]'和使用@christoph建議的解決方案的y平均值。 – Sid

回答

3

可以使用stat_summary()功能。

library(ggplot2) 
data <- data.frame(y = rnorm(10,0,1), x = runif(10,0,1)) 
data$bins <- cut(data$x,breaks = 4) 
# Points: 
ggplot(data, aes(x = bins, y = y)) + 
    stat_summary(fun.y = "mean", geom = "point") 

# Histogram bars: 
ggplot(data, aes(x = bins, y = y)) + 
    stat_summary(fun.y = "mean", geom = "histogram") 

這裏是點的畫面:

enter image description here

1

由於您的y值的平均值可以小於0,我推薦一個點圖,而不是條形圖。點代表手段。您可以使用qplot或常規ggplot函數。後者更具可定製性。在這個例子中,兩者都產生相同的輸出。

library(ggplot2) 

set.seed(7) 
data <- data.frame(y = rnorm(10,0,1), x = runif(10,0,1)) 
data$bins <- cut(data$x,breaks = 4, dig.lab = 2) 

qplot(bins, y, data = data, stat="summary", fun.y = "mean") 

ggplot(data, aes(x = factor(bins), y = y)) + 
    stat_summary(fun.y = mean, geom = "point") 

您還可以添加錯誤欄。在這種情況下,它們顯示組平均值+/- 1.96倍的組標準偏差。組平均值和SD可以使用tapply獲得。

m <- tapply(data$y, data$bins, mean) 
sd <- tapply(data$y, data$bins, sd) 
df <- data.frame(mean.y = m, sd = sd, bin = names(m)) 

ggplot(df, aes(x = bin, y = mean.y, 
       ymin = mean.y - 1.96*sd, 
       ymax = mean.y + 1.96*sd)) + 
    geom_errorbar() + geom_point(size = 3) 

enter image description here