2012-05-08 8 views
11

Ich muss eine Reihe von horizontal gruppierten Balkendiagrammen erstellen. Die Barplot-Funktion passt die Ränder des Plots nicht automatisch an, daher wird der Text abgeschnitten.Automatische Anpassung der Ränder im horizontalen Balkendiagramm

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

Ich kann nicht eine Option finden, um automatisch die Handlung weiter nach rechts, der Weg R dotchart Funktion macht es ((barchart Verfahren in SAS stellt die Ränder automatisch auch) zu bewegen. offensichtlich kann ich immer passen Sie die Ränder manuell par-Funktion.

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

das Grundstück nach rechts

bewegen

Gibt es eine Option, um das Diagramm nach rechts zu verschieben (d. H. die Ränder anpassen) automatisch abhängig von der Länge des Textes?

kann ich mich vorstellen 2 im Zusammenhang appproaches es programmatisch zu tun: 1) Berechnen Sie die Länge der längsten Textzeichenfolge und entsprechend den linken Rand 2) Erstellen Sie einen dotchart Plot für die Daten anpassen, erfassen irgendwie die Ränder und Verwendung die gleichen Ränder in Balkendiagramm.

Gibt es einen einfacheren Weg? Danke!

Antwort

11

Ich denke, Ihre erste Idee ist wahrscheinlich am besten geeignet. So etwas scheint in Ordnung zu sein und erfordert nicht viel Füllung.

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) 

Nach dotchart Inspektion, eine verallgemeinerbare Lösung kann auch zu verwenden sein:

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

Thank you! Ich habe Ihren Code mit verschiedenen Textstrings versucht, die Ränder funktionieren gut. Wie bist du auf 1.8 gekommen? –

+0

@MaxCherny - nur einige Grundrechenarten auf dem nchar: margin ratio und ein bisschen Versuch und Irrtum. Ich kann nicht versprechen, dass es an verschiedene Schriftgrößen/Stile angepasst werden kann, aber die Berechnungen können ziemlich einfach angepasst werden, wie Sie sehen können. – thelatemail

+0

@thelatemail - Ich frage mich, ob die obige Lösung berücksichtigt Expansionsfaktoren, sagen wir, wenn ich cex.lab = 2, anstatt der Standard 1 gesetzt. Danke! – Alex