2010-01-27 22 views
7

Me gustaría colocar el valor de cada barra en el gráfico de barras (celosía) en la parte superior de cada barra. Sin embargo, no puedo encontrar ninguna opción con la que pueda lograr esto. Solo puedo encontrar opciones para el eje.agregar etiquetas al reticulado barchart

Respuesta

19

Cree una función de panel personalizada, p.

library("lattice") 
p <- barchart((1:10)^2~1:10, horiz=FALSE, ylim=c(0,120), 
       panel=function(...) { 
       args <- list(...) 
       panel.text(args$x, args$y, args$y, pos=3, offset=1) 
       panel.barchart(...) 
       }) 
print(p) 

lattice barchart with labels

+1

Impresionante al máximo! –

0

Hubiera sugerido usar el nuevo directlabels package, que se puede usar con celosía y ggplot (y hace que la vida sea muy fácil para estos problemas de etiquetado), pero desafortunadamente no funciona con los diagramas de barras.

-1

Si está utilizando el parámetro groups se encuentran las etiquetas de código de RCS @ toda la tierra en la parte superior de uno al otro. Esto se puede solucionar ampliando panel.text para que funcione como panel.barchart, que es bastante fácil si conoce R.

No puedo publicar aquí el código de la corrección por motivos de licencia, lo siento.

+0

¿Qué significa eso? ¿Está desarrollando herramientas propietarias (que deberían ser internas para ser legales) basadas en celosía? (Solo curiosidad) –

+0

porque una versión parchada de 'panel.text' sería un trabajo derivado. Siempre estoy feliz de publicar muestras de código que escribo completamente yo mismo. También puedo tener contratos en cualquier momento con mi empleador que tengan relación con la contribución a GPL. –

0

Ya que tuve que hacer esto de todos modos, aquí hay un ejemplo de código lo suficientemente cercano a la figura de lo que @Alex Brown sugiere (las puntuaciones son una matriz 2D de algún tipo, que se convertirá en un vector agrupados):

barchart(scores, horizontal=FALSE, stack=FALSE, 
    xlab='Sample', ylab='Mean Score (max of 9)', 
    auto.key=list(rectangles=TRUE, points=FALSE), 
    panel=function(x, y, box.ratio, groups, errbars, ...) { 
     # We need to specify groups because it's not actually the 4th 
     # parameter 
     panel.barchart(x, y, box.ratio, groups=groups, ...) 
     x <- as.numeric(x) 
     nvals <- nlevels(groups) 
     groups <- as.numeric(groups) 
     box.width <- box.ratio/(1 + box.ratio) 
     for(i in unique(x)) { 
      ok <- x == i 
      width <- box.width/nvals 
      locs <- i + width * (groups[ok] - (nvals + 1)/2) 
      panel.arrows(locs, y[ok] + 0.5, scores.ses[,i], ...) 
     } 
    }) 

no he probado esto, pero los bits importantes (las partes que determinan las locomotoras etc. dentro de la función de panel) hacer el trabajo. Esa es la parte difícil de resolver. En mi caso, en realidad estaba usando panel.arrows para crear barras de error (¡el horror!). Pero scores.ses pretende ser una matriz de la misma dimensión que los puntajes.

Trataré de limpiar esto más tarde, pero si alguien más quiere, ¡me alegro!

Cuestiones relacionadas