2012-10-24 8 views
10

Mam zestaw danych, w którym pomiary są dokonywane dla różnych grup w różnych dniach.Jak zrobić dodge w geom_bar zgadzam się z dodge w geom_errorbar, geom_point

Chcę mieć obok siebie paski reprezentujące pomiary w różnych dniach dla różnych grup z grupami prętów rozmieszczonymi zgodnie z dniem pomiaru z nałożonymi na nie paskami błędu.

Mam problem z wykonaniem uników w geom_bar zgadzam się z dodge na geom_errorbar.

Oto prosty kawałek kodu:

days   = data.frame(day=c(0,1,8,15)); 
groups  = data.frame(group=c("A","B","C","D", "E"), means=seq(0,1,length=5)); 


my_data  = merge(days, groups); 


my_data$mid = exp(my_data$means+rnorm(nrow(my_data), sd=0.25)); 
my_data$sigma = 0.1; 


png(file="bar_and_errors_example.png", height=900, width=1200); 
plot(ggplot(my_data, aes(x=day, weight=mid, ymin=mid-sigma, ymax=mid+sigma, fill=group)) + 
    geom_bar  (position=position_dodge(width=0.5))         + 
    geom_errorbar (position=position_dodge(width=0.5), colour="black")     + 
    geom_point (position=position_dodge(width=0.5), aes(y=mid, colour=group))); 
dev.off(); 

W działce, errorsegments pojawia się stałe przesunięcie z barem (Niestety, nie Działki dozwolony dla początkujących, nawet jeśli ggplot2 jest przedmiotem).

Po dostosowaniu szerokości w geom_bar przesunięcie nie jest stałe i zmienia się z dnia na dzień.

Zauważ, że geom_errorbar i geom_point unik w tandemie. Jak uzyskać geom_bar, aby zgodzić się z pozostałymi dwoma?

Każda pomoc doceniona.

Odpowiedz

12

Problemy z wyrównaniem wynikają częściowo z tego, że pręty nie reprezentują danych, które zamierzasz. Następujące linie się poprawnie:

ggplot(my_data, aes(x=day, weight=mid, ymin=mid-sigma, ymax=mid+sigma, fill=group)) + 
    geom_bar  (position=position_dodge(), aes(y=mid), stat="identity") + 
    geom_errorbar (position=position_dodge(width=0.9), colour="black") + 
    geom_point (position=position_dodge(width=0.9), aes(y=mid, colour=group)) 

enter image description here

3

Pierwsza zmiana I sformatowany kod według advanced R style guide.

days <- data.frame(day=c(0,1,8,15)) 

groups <- data.frame(
    group=c("A","B","C","D", "E"), 
    means=seq(0,1,length=5) 
    ) 

my_data <- merge(days, groups) 

my_data$mid <- exp(my_data$means+rnorm(nrow(my_data), sd=0.25)) 
my_data$sigma <- 0.1 

Teraz, gdy patrzymy na dane, które widzimy, ten dzień jest czynnikiem, a wszystko inne jest takie samo.

str(my_data) 

Aby usunąć spację z wykresu, przekonwertowałem kolumnę z dnia na czynniki. SPRAWDŹ, czy poziomy są we właściwej kolejności, zanim przejdziesz dalej.

my_data$day <- as.factor(my_data$day) 
levels(my_data$day) 

Kolejna zmiana zrobiłem było określenie rw swoimi aes argumentów. Jak jestem pewien, wiesz, to pozwala ggplot wiedzieć, gdzie szukać wartości y. Następnie zmieniłem argument pozycji na "dodge" i dodano argument stat="identity". Argument "identity" mówi ggplot, aby wykreślić y na x. geom_errorbar dziedziczy pozycję dodge z geom_bar, więc możesz zostawić ją nieokreśloną, ale geom_point nie musi więc określać tej wartości. Domyślnym unikem jest position_dodge(.9).

ggplot(data = my_data, 
aes(x=day, 
    y= mid, 
    ymin=mid-sigma, 
    ymax=mid+sigma,  
    fill=group)) + 
    geom_bar(position="dodge", stat = "identity") + 
    geom_errorbar(position = position_dodge(), colour="black") + 
    geom_point(position=position_dodge(.9), aes(y=mid, colour=group)) 

enter image description here

Powiązane problemy