2012-05-08 10 views
11

Necesito producir una serie de gráficos de barras agrupadas horizontales. La función de gráfico de barras no ajusta automáticamente los márgenes de la gráfica, por lo tanto, el texto se corta.Ajuste automático de los márgenes en el gráfico de barras horizontales

graphics.off()  # close graphics windows 
    test <- matrix(c(55,65,30, 40,70,55,75,6,49,45,34,20), 
        nrow =3 , 
       ncol=4, 
       byrow=TRUE, 
       dimnames = list(c("Subgroup 1", "Subgroup 2", "Subgroup 3"), 
           c(
           "Category 1 Long text", 
           "Category 2 very Long text", 
           "Category 3 short text", 
           "Category 4 very short text" 
           ))) 
    barplot(test, 
     las=2, 
     beside = TRUE, 
     legend=T, 
     horiz=T) 

enter image description here

no puedo encontrar una opción para mover automáticamente la trama más a la derecha, la función R dotchart manera lo hace ((procedimiento de diagrama de barras en el SAS ajusta automáticamente los márgenes también). obviamente, siempre puedo ajustar los márgenes de forma manual utilizando la función de la altura.

par(mar=c(5.1, 13 ,4.1 ,2.1)) 

va a avanzar la trama hacia la derecha

enter image description here

¿Hay una opción para mover la gráfica a la derecha (es decir ajustar los márgenes) automáticamente dependiendo de la longitud del texto?

puedo pensar en 2 appproaches relacionados con hacerlo mediante programación: 1) Calcular la longitud de la cadena de texto más largo y en consecuencia ajustar el margen izquierdo 2) Crear una parcela dotchart de los datos, de alguna manera capturar los márgenes y el uso los mismos márgenes en el gráfico de barras.

¿Hay alguna manera más fácil de hacerlo? Gracias!

Respuesta

11

Creo que su primera idea es probablemente la más adecuada. Algo como esto parece funcionar bien y no requiere mucho alboroto.

ylabels <- c( "1oooooooooooo", 
      "2", 
      "3", 
      "4" 
) 

test <- matrix(c(55,65,30, 40,70,55,75,6,49,45,34,20), 
        nrow =3 , 
       ncol=4, 
       byrow=TRUE, 
       dimnames = list(c("Subgroup 1", "Subgroup 2", "Subgroup 3"), 
           ylabels)) 

# adjust to the maximum of either the default 
# or a figure based on the maximum length 
par(mar=c(5.1, max(4.1,max(nchar(ylabels))/1.8) ,4.1 ,2.1)) 

barplot(test, 
     las=2, 
     beside = TRUE, 
     legend=T, 
     horiz=T) 

Después de inspeccionar dotchart, una solución más generalizable también puede ser el uso de:

linch <- max(strwidth(ylabels, "inch")+0.4, na.rm = TRUE) 
par(mai=c(1.02,linch,0.82,0.42)) 
+0

Gracias! Probé tu código con diferentes cadenas de texto, los márgenes funcionan bien. ¿Cómo se te ocurrió 1.8? –

+0

@MaxCherny: solo una aritmética básica en la relación nchar: margin y un poco de prueba y error. No puedo prometer que sea adaptable a diferentes tamaños/estilos de fuente, pero los cálculos se pueden ajustar fácilmente como puede ver. – thelatemail

+0

@thelatemail - Me pregunto si la solución anterior tiene en cuenta los factores de expansión, por ejemplo, si configuro cex.lab = 2, en lugar de la predeterminada 1. ¡Gracias! – Alex

Cuestiones relacionadas