2012-05-01 11 views
5

Ésta es una continuación de la pregunta aquí: Create non-overlapping stacked area plot with ggplot2Añadir etiquetas directos a ggplot2 tabla geom_area

Tengo un gráfico de áreas ggplot2 creado por el siguiente código. Quiero que las etiquetas de names estén alineadas en el lado derecho del gráfico. Creo que directlabels podría funcionar, pero estoy dispuesto a probar lo que sea más inteligente.

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

estoy totalmente nuevo a directlabels y no muy seguro de cómo obtener las etiquetas para alinear al lado derecho de la gráfica con los mismos colores que las áreas.

Respuesta

5

Puede usar el simple geom_text para agregar etiquetas. En primer lugar, un subconjunto de datos establecidos para obtener el valor final X:

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

a continuación, para la trama de datos por nivel de factor:

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

luego trabajar el porcentaje acumulado para el trazado:

dd$cum = cumsum(dd$percent) 

Luego solo use una llamada estándar geom_text:

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

Ah, y es posible que desee ángulo de sus etiquetas del eje x para evitar el exceso de trazado:

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

Gráfico

enter image description here

+0

Gracias por la respuesta. Necesito encontrar etiquetas directas, porque no sé cuán generalizable es este enfoque. – Idr

+0

@csgillespie, esto fue útil gracias. Aquí la sintaxis que utilicé (otra df): '' + geom_text (data = subconjunto (df, Year == "2012"), aes (x = Year, y = cumsum (value), label = variable), vjust = 6 , hjust = -.2, size = 4) '', donde lo encontré complicado para obtener los parámetros '' vjust'' y '' hjust'' correctos. Lo digo para enfatizar que puedes pasar '' cumsum'' a '' aes() '', que descubrí por prueba y error. Para la leyenda de la derecha, es útil establecer '' + guides (fill = guide_legend (reverse = TRUE)) '' para obtener los colores en el mismo orden que la imagen. ¿Desea actualizar el '' opts'' en desuso? – PatrickT

+0

Y para capturar el último elemento del marco de datos ('' 06-at-the-codfish-ball'' en el OP y '' 2012'' en mi comentario anterior), puedes usar '' tail() '' función con el argumento '1', por ejemplo '' cola (df2.1 $ Año, 1) '' – PatrickT

Cuestiones relacionadas