2012-05-01 16 views
5

Jest to kontynuacja pytanie tutaj: Create non-overlapping stacked area plot with ggplot2Dodaj bezpośrednie etykiet ggplot2 wykres geom_area

Mam wykres warstwowy ggplot2 utworzony przez następujący kod. Chcę, aby etykiety od names były wyrównane po prawej stronie wykresu. Myślę, że directlabels może działać, ale jestem gotów spróbować wszystkiego, co jest najbardziej sprytne.

require(ggplot2) 
require(plyr) 
require(RColorBrewer) 
require(RCurl) 
require(directlabels) 

link <- getURL("http://dl.dropbox.com/u/25609375/so_data/final.txt") 
dat <- read.csv(textConnection(link), sep=' ', header=FALSE, 
     col.names=c('count', 'name', 'episode')) 


dat <- ddply(dat, .(episode), transform, percent = count/sum(count)) 

# needed to make geom_area not freak out because of missing value 
dat2 <- rbind(dat, data.frame(count = 0, name = 'lane', 
          episode = '02-tea-leaves', percent = 0)) 

g <- ggplot(arrange(dat2,name,episode), aes(x=episode,y=percent)) + 
    geom_area(aes(fill=name, group = name), position='stack') + scale_fill_brewer() 

g1 <- g + geom_dl(method='last.points', aes(label=name)) 

enter image description here

Jestem nowy na directlabels i naprawdę nie wiem, jak się etykiety, aby wyrównać do prawej strony wykresu z tych samych kolorach jak obszarach.

Odpowiedz

5

Możesz użyć prostego geom_text, aby dodać etykiety. Po pierwsze, podzbiór ci zestaw danych, aby uzyskać ostateczną wartość x:

dd=subset(dat, episode=="06-at-the-codfish-ball") 

Następnie zamówić ramkę danych przez poziom czynnika:

dd = dd[with(dd, order(name, levels(dd$name))),] 

Następnie wypracować skumulowany procent do kreślenia:

dd$cum = cumsum(dd$percent) 

Następnie wystarczy użyć standardowego połączenia geom_text:

g + geom_text(data=dd, aes(x=6, y=cum, label=name)) 

Och, a może chcesz kątem etykiet oś X w celu uniknięcia nadmiernego kreślenia:

g + opts(axis.text.x=theme_text(angle=-25, hjust=0.5, size = 8)) 

Graph

enter image description here

+0

Dzięki za odpowiedź. Muszę wymyślić directlabele, bo nie wiem, jak można to podejście uogólnić. – Idr

+0

@csgillespie, To było przydatne dzięki. Oto składnia, której użyłem (inny df): '' + geom_text (dane = podzbiór (df, rok == "2012"), aes (x = rok, y = cumsum (wartość), etykieta = zmienna), vjust = 6 , hjust = -.2, size = 4) '', gdzie znalazłem to skrzypce, aby poprawnie uzyskać parametry '' vjust'' i '' hjust''. Mówię to, aby podkreślić, że możesz przekazać '' cumsum'' do '' aes() '', które odkryłem metodą prób i błędów. W przypadku legendy po prawej stronie warto ustawić '' + guides (fill = guide_legend (reverse = TRUE)) '', aby uzyskać kolory w tej samej kolejności, co obraz. Czy chcesz zaktualizować przestarzałe '' opts''? – PatrickT

+0

Aby złapać ostatni element ramki danych ('' 06-at-the-codfish-ball'' w OP i '' 2012'' w powyższym komentarzu), możesz użyć '' tail() '' funkcja z argumentem '1', np '' ogon (df2.1 $ Rok, 1) '' – PatrickT

Powiązane problemy