2015-03-04 17 views
7

Po tym pytaniu: How to add a number of observations per group and use group mean in ggplot2 boxplot?, chcę dodać liczbę obserwacji na grupę również w ggplot boxplot. Ale dodałem kolor do mapowania aes.Dodaj liczbę obserwacji na grupę w ggplot2 boxplot

Istniejąca odpowiedź pokazuje, jak dostosować pozycję tekstu na osi y. Jak mogę dostosować pozycję tekstu na osi X?

Jest to minimalny przykład odtworzyć mój problem:

library(ggplot2) 

give.n <- function(x){ 
    return(c(y = median(x)*1.05, label = length(x))) 
    # experiment with the multiplier to find the perfect position 
} 


p <- ggplot(mtcars, aes(factor(vs), mpg, colour = factor(am))) + 
    geom_boxplot() + 
    stat_summary(fun.data = give.n, geom = "text", fun.y = median) 
p 

enter image description here

Dzięki za wszelkie sugestie.

Odpowiedz

7

można po prostu użyć position:

p <- ggplot(mtcars, aes(factor(vs), mpg, colour = factor(am))) + 
    geom_boxplot() + 
    stat_summary(fun.data = give.n, geom = "text", fun.y = median, 
        position = position_dodge(width = 0.75)) 
p 

enter image description here

width argument position_dodge() kontroli pozycjonowania w osi poziomej. 0.75 jest sweet spot, zobacz jak to działa dla różnej liczby ugrupowań:

p2 <- ggplot(mtcars, aes(factor(vs), mpg, colour = factor(cyl))) + 
     geom_boxplot() + 
     stat_summary(fun.data = give.n, geom = "text", fun.y = median, 
        position = position_dodge(width = 0.75)) 
p2 

enter image description here

1

Zamiast stat_summary, można użyć geom_text. Proszę zapoznać się z następującym pytaniem: ggplot2 add text on top of boxplots.

Jest to przykład tego, jak można to zrobić z liczbą obserwacji:

# Create an aggregate of median & count 
> cts <- merge(aggregate(mpg ~ cyl + am, mtcars, length), 
       aggregate(mpg ~ cyl + am, mtcars, median), 
       by=c("cyl", "am")) 
# Rename the col names to fit with the original dataset.. 
> names(cts) <- c("cyl", "am", "count", "mpg") 
# As alexwhan suggested, position_dodge helps with positioning 
# along the x-axis.. 
> ggplot(mtcars, aes(factor(cyl), mpg, colour = factor(am))) + 
    geom_boxplot(position = position_dodge(width=1.0)) + 
    geom_text(data = cts, aes(label=count), 
      position=position_dodge(width=1.0)) 
+0

Dzięki za sugestię – Bangyou

+0

'geom_text' nie wydaje się robić liczby grup. Czy możesz pokazać kod jak to zrobić z 'geom_text'? – arun

+0

'geom_text' jest funkcją etykietowania tekstu, nie wykonuje żadnych agregacji ani statystyk podsumowujących dane. Ale możesz utworzyć agregat zbioru danych, który oblicza liczbę na grupę i użyć go jako danych wejściowych do 'geom_text'. Poprawiłem moją odpowiedź, aby podać przykład. – szabad

Powiązane problemy