2016-07-20 4 views
0
test_data <- data.frame(x = runif(20, 0, 10), y = runif(20, 0, 10)) 

ggplot(test_data, aes(x)) + geom_histogram(binwidth = 1) 

test_data <- test_data %>% arrange(x) 
test_list <- list() 
for(i in 1:10){ 
    test_list[[i]] <- test_data %>% filter(x < i & x > i-1) 
} 
test_list 

test_means <- c() 
for(i in 1:10){test_means[i] <- mean(test_list[[i]]$y)} 
test_means 

다들 안녕 위의 변수 Y의 평균을 변수 x를 계산하고 표시하는 막대 그래프,ggplot : 빈

나는 히스토그램 및 ggplot2에 대한 자세한 내용을 보려면 노력하고있어. 내가 원하는 것은 변수 x을 사용하여 히스토그램을 플로팅 한 다음, 각 빈에 표시된 하위 그룹에 대한 변수 y의 평균값을 얻고 싶습니다. 마지막으로 히스토그램의 빈 위에이 평균값을 배치하려고합니다.

가) 각 빈 - 하위 그룹에 대한 y의 평균을 얻을 수 ggplot2 기능 (또는 그 문제에 대한 모든 다른 기능)이 있습니까 :

이 질문은 두 배입니다. 지금은 for() 함수를 binwidth에 의해 변수의 x의 최소값에서 최대 값까지 반복하는 함수를 만드는 것으로 생각할 수 있습니다. 매우 깨끗하거나 간결하지 않습니다 ...

b) ggplot2은 해당 bin 상단에 새로 식별 된 평균값이 y 인 각 입력란과 같은 변수를 제공합니까?

감사합니다.

답변

1

아무것도 당신이 무엇을 물어 수행 할 stat_bin() 기능 (geom_histogram() 호출)에 내장하지만 너무 어렵지 않다 (또는 명사에 붙여서의 뜻을 나타냄 [클린 | 간결]) 당신이 무엇을 물어해야 할 일 :

library(ggplot2) 
library(dplyr) 

set.seed(15) # reproducible 

test_data <- data.frame(x = runif(20, 0, 10), 
         y = runif(20, 0, 10)) 

gg <- ggplot(test_data, aes(x)) + 
    geom_histogram(binwidth=1, fill="#2166ac", color="white") 

mean_bin <- function(df) { 
    filter(test_data, x > df$xmin & x <= df$xmax) %>% 
    summarise(μ=mean(y), ct=df$count[1]) %>% 
    mutate(μ=ifelse(is.nan(μ), NA, μ)) 
} 

group_by(ggplot_build(gg)$data[[1]], x) %>% 
    do(mean_bin(.)) %>% 
    ungroup() -> bin_means 


gg <- gg + geom_text(data=bin_means, 
        aes(x, ct, label=sprintf("μ(y)=%3.2f", μ)), 
        vjust=0, nudge_y=0.1, size=2.5) 
gg <- gg + scale_x_continuous(breaks=1:10) 
gg <- gg + scale_y_continuous(expand=c(0,0), limits=c(0, 4.5)) 
gg <- gg + theme_bw() 
gg <- gg + theme(panel.grid.major.x=element_blank()) 
gg <- gg + theme(panel.grid.minor=element_blank()) 
gg <- gg + theme(panel.border=element_blank()) 
gg <- gg + theme(axis.ticks=element_blank()) 
gg 

enter image description here

은 기본적으로 저장소를 오른쪽으로 닫으므로 <= df$xmax을 수행해야합니다.

+1

당신은 최고입니다! 이것은 믿을 수 없을만큼 유익했다. 나는 ggplot2와 r에 대해 많이 배웠다. 나는 너의 대답을 위해 너를 충분히 감사 할 수 없다! 나는 이것으로 반짝이는 앱을 만들었고 어떤 변수가 어떤 함수를 참조 하는지를 알아내는 것은 매우 유용한 운동이었다. 또한 'r'에 'μ'를 사용할 수 있습니까? 아니면 단지 설명을 목적으로 사용 했습니까? 'μ'는 제 'r'버전에서 적절한 문자가 아닌 것 같습니다. 다시 말하지만, 당신은 굉장합니다! – beemyfriend

+0

적어도 내 UTF-8 OS X 환경에서 완전히 유효한 문자. 이것이 도움이 된 것을 기쁘게 생각합니다. – hrbrmstr

1

당신은 기본 R을 시도 할 수 있습니다 :

# data 
set.seed(123) 
d <- data.frame(x = runif(20, 0, 10), y = runif(20, 0, 10)) 
# plot the histogram, save the parameters in n 
n <- hist(d$x, ylim = c(0, max(d$x))) 
# get the x-binning, saved in n$breakes and save this in d$bins 
d$bins <- .bincode(d$x,breaks = n$breaks) 
# aggregate to get the y mean per bin group 
a <- aggregate(d$y, list(d$bins), mean) 
# add the segments 
segments(x0 = n$breaks[-length(n$breaks)], y0 = a$x, x1 = n$breaks[-1], y1 = a$x, col = "red") 
# add text 
text(x = n$breaks +1, y = a$x, labels = round(a$x,2), pos = 1) 

enter image description here

+0

와우, 이건 아주 간단하고 간단합니다. 이것은 정말로 도움이되었습니다. 나는 많은 것을 배웠고 '기본 r'이 많은 통제를 제공한다는 단서가 없다. 나는 실제로 라벨의 높이를 결정하기 위해 평균을 사용하는 아이디어를 좋아합니다. 정말 고맙습니다! – beemyfriend