2012-05-01 14 views
5

Questa è una continuazione della domanda qui: Create non-overlapping stacked area plot with ggplot2Aggiungere etichette diretti al ggplot2 grafico geom_area

Ho un grafico ad area ggplot2 creato da seguente codice. Voglio che le etichette da names siano allineate sul lato destro del grafico. Penso che lo directlabels possa funzionare, ma sono disposto a provare qualsiasi cosa sia più intelligente.

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

Sono nuovo di directlabels e non realmente sicuro di come ottenere le etichette di adeguamento alla parte destra del grafico con gli stessi colori come le zone del marchio.

risposta

5

È possibile utilizzare il semplice geom_text per aggiungere etichette. In primo luogo, sottoinsieme set di dati per ottenere il valore x finale:

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

poi ordinare il frame di dati dal livello di fattore:

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

poi lavorare fuori la percentuale cumulativa per il tracciato:

dd$cum = cumsum(dd$percent) 

Quindi utilizzare una chiamata standard geom_text:

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

Oh, e si consiglia di angolo di etichette di asse x, onde evitare di tracciare:

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

Grafico

enter image description here

+0

Grazie per la risposta. Ho bisogno di capire i directlabels, perché non so quanto questo approccio sia generalizzabile. – Idr

+0

@csgillespie, questo è stato utile grazie. Qui la sintassi che ho usato (un altro df): '' + geom_text (data = sottoinsieme (df, Anno == "2012"), aes (x = Anno, y = cumsum (valore), etichetta = variabile), vjust = 6 , hjust = -.2, size = 4) '', dove ho trovato faticoso ottenere i parametri '' vjust'' e '' hjust'' correttamente. Lo sto dicendo per sottolineare che puoi passare '' cumsum'' a '' aes() '', che ho scoperto per tentativi ed errori. Per la legenda a destra, è utile impostare '' + guide (fill = guide_legend (reverse = TRUE)) '' per ottenere i colori nello stesso ordine dell'immagine. Vuoi aggiornare il deprecato '' opts''? – PatrickT

+0

E per catturare l'ultimo elemento del dataframe ('' 06-at-the-codfish-ball'' nell'OP e '' 2012'' nel mio commento sopra), puoi usare '' tail() '' funzione con argomento '1', ad es '' tail (df2.1 $ Year, 1) '' – PatrickT

Problemi correlati