2010-01-22 20 views
5

tengo una casi-gráfico de caja como la fluctuación de parcelas:Añadir etiquetas subgrupo de una parcela de fluctuación en ggplot2

dt <- rbind(se,cb,cb.se) 
qplot(ds, size, data=dt, geom="jitter", colour=root, facets = test ~ .) 

plot http://i50.tinypic.com/1zbfjih.png

me encantaría poner una etiqueta de resumen para cada grupo en el medio de la trama - por ejemplo, el tamaño asciende aquí:

aggregate(list(size=dt$size), list(dt$ds, dt$test), sum) 

    Group.1 Group.2 size 
1  b217  se 9847 
2  c10  se 97296 
3  c613  se 21633 
4  c7  se 207540 
... 

he intentado usar + geom_text(aes(x=ds, y=128, label=sum(size)), size=2) añadir etiquetas, pero tengo la misma etiqueta en cada posición - ¿cómo puedo obtener la suma de solo esa sección de datos?

Editar: Aquí es donde estoy ahora - tal vez sólo voy en la dirección equivocada

data <- rbind(se,cb,cb.se) 
labels <-ddply(data, c("ds", "test"), function(df) sum(df$size)) 
ggplot(data=data, aes(x=ds)) + 
    geom_jitter(aes(y=size, colour=root)) + 
    geom_text(data=labels, aes(x=ds, y=600, label=V1), size=3) + 
    facet_wrap(test ~ .) 

Este código no funciona - Me aparece un error en alguna parte ... undefined columns selected . ¿Tal vez sea por las múltiples secciones data=?

+0

De una lectura rápida, que el código se ve bien para mí. Es difícil decir más sin un ejemplo reproducible. – hadley

+1

He publicado una solución. Lamentablemente, como no ha proporcionado datos de muestra, tuve que volver a crear datos aleatorios. Esto significa que la solución puede o no reflejar sus propios datos. Para referencia futura, atraerá más respuestas si hace un ejemplo mínimo de su problema y pega algunos datos de muestra que todos podemos usar para reproducir su problema. De todos modos, espero que ayude. – Andrie

Respuesta

6

Dado que no proporciona datos de muestra, demostraré una solución utilizando datos aleatorios.

set.seed(1) 
n <- 100 
dat <- data.frame(
    ds = sample(paste("x", 1:8, sep=""), n, replace=TRUE), 
    size = runif(n, 0, 250), 
    root = sample(c(TRUE, FALSE), n, replace=TRUE), 
    test = sample(c("se", "cb", "cb.se"), n, replace=TRUE) 
) 


head(dat) 
    ds  size root test 
1 x3 163.68098 TRUE cb.se 
2 x3 88.29932 TRUE se 
3 x5 67.56504 FALSE cb 
4 x8 248.17102 TRUE cb 
5 x2 158.37332 TRUE cb 
6 x8 53.30203 FALSE cb.se 

p <- ggplot(dat, aes(x=ds, y=size)) + 
    geom_jitter(aes(colour=root)) + 
    facet_grid(test~.) 

Cree el marco de datos que contiene los datos de la etiqueta. Tenga en cuenta el uso de summarize. Esto le dice a ddply para crear una nueva columna a la hoja.de.datos

labels <- ddply(dat, .(ds, test), summarize, size=round(sum(size), 0)) 
head(labels) 
    ds test size 
1 x1 cb 193 
2 x1 cb.se 615 
3 x1 se 274 
4 x2 cb 272 
5 x2 cb.se 341 
6 x2 se 1012 

p + geom_text(aes(x=ds, label=size, y=128), data=labels, size=2) 

enter image description here

+0

Esto se ve exactamente como lo que necesitaba. ¡Gracias! – Thelema

+1

@Thelema, me alegro de poder ser de ayuda. (Recuerde asignar la recompensa, ya que esto no sucede automáticamente) – Andrie

+0

bien merecido. bonito. y rápido :) –

1

Echa un vistazo aquí. Puede ser útil Adding direct labels to ggplot2 and lattice plots

+0

directlabels no resuelve mi problema, no se posiciona bien en diagramas de fluctuación de fase, y quiere usar mis etiquetas de leyenda para etiquetar el gráfico en lugar de las etiquetas proporcionadas. – Thelema

Cuestiones relacionadas