2013-09-25 11 views
10

Ja próbuje umieszczać etykiety na skumulowany słupkowy działce przy użyciu tej metody (choć jeśli nie ma teraz lepsze podejście jestem otwarty na to, co kiedykolwiek):etykiety Centrum ułożone bar (zliczenia) ggplot2

Showing data values on stacked bar chart in ggplot2

Oto moja oryginalna fabuła:

dat <- data.frame(with(mtcars, table(cyl, gear))) 

ggplot(dat, aes(x = gear, fill = cyl)) + 
    geom_bar(aes(weight=Freq), position="stack") + 
    geom_text(position = "stack", aes(x = gear, y = Freq, 
     ymax = 15, label = cyl), size=4) 

enter image description here

Oto moja próba centrum etykiety w każdej sekcji Wypełnienie:

dat2 <- ddply(dat, .(cyl), transform, pos = cumsum(Freq) - 0.5*Freq) 

library(plyr) 
ggplot(dat2, aes(x = gear, fill = cyl)) + 
    geom_bar(aes(weight=Freq), position="stack") + 
    geom_text(position = "stack", aes(x = gear, y = pos, 
     ymax = 15, label = cyl), size=4) 

enter image description here

Jak mogę wyśrodkować etykiety w każdej sekcji wypełnienia?

Odpowiedz

10

Jest jakiś obcy ddply akcja dzieje się z tego jak ja znał rozwiązanie chciałem, ale był problem z utrzymaniem częstotliwości wyrównane ze stanowiskami, ale myślę, że algorytm znajdowania midpoints grupa jest warta wpis:

group_midpoints = function(g) { 
    cumsums = c(0, cumsum(g$Freq)) 
    diffs = diff(cumsums) 
    pos = head(cumsums, -1) + (0.5 * diffs) 
    return(data.frame(cyl=g$cyl, pos=pos, Freq=g$Freq)) 
} 

dat3 = ddply(dat, .(gear), group_midpoints) 

ggplot(dat3, aes(x = gear, fill = cyl)) + 
    geom_bar(aes(weight=Freq), position="stack") + 
    geom_text(position = "identity", aes(x = gear, y = pos, ymax = 15, label = cyl), size=4) 

enter image description here

+0

Idealny. Byłem blisko, ale nie całkiem. +1 –

Powiązane problemy