2016-07-20 5 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 

Hey y'all,ggplot: ein Histogramm, die Variable x zählt und zeigt den Mittelwert der Variable y über den ist

Ich versuche, mehr über Histogramme und ggplot2 zu lernen. Was ich tun will, ist ein Histogramm mit der Variablen x, ich möchte dann den Mittelwert der Variablen y für die Untergruppe in jeder Bin dargestellt, und schließlich möchte ich diesen Mittelwert oberhalb der Bin im Histogramm platzieren.

Diese Frage ist zweifach:

a) Gibt es eine ggplot2 Funktion (oder eine andere Funktion für diese Angelegenheit), die den Mittelwert von y für jede Bin-Untergruppe bekommen. Im Moment kann ich nur an eine for() Funktion denken, die von 0min auf x um binwidth iteriert. Es ist nicht sehr sauber oder prägnant ...

b) Bietet ggplot2 eine Möglichkeit, eine Variable wie den neu identifizierten Mittelwert y für jeden Fach oben auf dem entsprechenden Fach aufzustellen?

Vielen Dank für Ihre Zeit.

Antwort

1

Nichts eingebaut, um die stat_bin() Funktion (die geom_histogram() Anrufe) zu tun, was Sie fragen, aber es ist nicht zu hart (oder un- [clean | prägnante]) zu tun, was Sie fragen:

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

Sie müssen <= df$xmax tun seit rechts schließt die Bins standardmäßig.

+1

Sie sind genial! Das war unglaublich informativ. Ich habe so viel über "ggplot2" und "r" im Allgemeinen gelernt. Ich kann dir nicht genug für deine Antwort danken! Ich habe damit eine glänzende App gemacht und herausgefunden, welche Variablen auf welche Funktion bezogen, war eine unglaublich nützliche Übung. Kann man auch "μ" in "r" verwenden oder hat man das nur zu demonstrativen Zwecken benutzt? 'μ' scheint in meiner Version von 'r' kein richtiger Charakter zu sein. Du bist wieder großartig! – beemyfriend

+0

absolut gültige Zeichen zumindest in meiner UTF-8 OS X-Umgebung. Super froh das hat geholfen. – hrbrmstr

1

Sie können Basis R versuchen:

# 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

Wow, das ist ziemlich einfach und geradlinig. Das war sehr hilfreich. Ich habe viel gelernt und hatte keine Ahnung, dass "Base r" so viel Kontrolle bietet. Ich mag die Idee, die tatsächliche mittlere Zahl zu verwenden, um die Höhe des Etiketts zu bestimmen. Ich danke dir sehr! – beemyfriend

Verwandte Themen