2016-07-15 11 views
7

ich ein ggplot2 Grundstück haben wie folgt:Raum zwischen gpplot2 horizontalen Legende Elemente

library(ggplot2) 

ggplot(mtcars, aes(factor(cyl), fill=factor(cyl))) + 
    geom_bar() + 
    coord_flip() + 
    theme(legend.position = 'top') + 
    guides(fill = guide_legend(title=NULL)) 

Ich mag Abstand zwischen den Füllungselemente hinzufügen würde wie folgt:

enter image description here

+2

Es scheint, als ob Sie in der Lage sein sollten, es mit etwas wie 'theme (legende.text = element_text (margin = margin (r = 2, unit = 'in')))' ', aber das scheint nicht zu tun mach alles. Ein hacky (aber effektive) Weg, es zu tun ist, einfach Räume zu den Elementen hinzuzufügen: 'fill = factor (paste (cyl, ''))' – alistaire

+0

@alistaire, das ist viel einfacher als mein Hack. Sie sollten es als Antwort hinzufügen. – eipi10

+1

Mögliches Duplikat von [Gibt es eine Möglichkeit, den Abstand zwischen Legendenelementen in ggplot2 zu ändern?] (Http://stackoverflow.com/questions/11366964/is-there-a-way-to-change-the-spacing-between) -legend-items-in-ggplot2) – user20650

Antwort

3

Es scheint wirklich so etwas wie theme(legend.text = element_text(margin = margin(r = 2, unit = 'in'))) der richtige Weg wäre, die Aufgabe zu erfüllen, aber das tut überhaupt nichts.

Stattdessen (und nicht zum ersten Mal) falle ich zurück auf dem Microsoft Word Stil der Ausrichtung-Hacking, dh nur Räume hinzu:

ggplot(mtcars, aes(factor(cyl), fill=factor(paste(cyl, '     ')))) + 
    geom_bar() + 
    coord_flip() + 
    theme(legend.position = 'top') + 
    guides(fill = guide_legend(title=NULL)) 

plot with spaced legend

Da Räume gibt es auf der 8 Außerdem ist es ein wenig außermittig, aber wenn Sie es einfach auf die vorherigen Etiketten kleben, können Sie sie nach Belieben verschieben.

Entschuldigung für irgendwelche Alpträume verursacht Grafikern.

+2

Es gibt [ein offenes Problem bei der Verwendung von 'margin' in' legend.text'] (https://github.com/hadley/ggplot2/issues/1502). – Henrik

+0

Ich werde dies markieren, aber klingt so wird in einer zukünftigen Version von ggplot2 behoben werden. Vielen Dank! –

+0

Ich glaube, auf github gibt es eine Reihe damit zusammenhängender Probleme. – lmo

1

Dies ist ein Hack , aber ...

Lassen Sie uns einige leere Faktorstufen in cyl zwischen den realen Ebenen hinzufügen. Dann stellen wir sicher, dass sie in den Plot eingeschlossen sind (drop=FALSE), um den Abstand in der Legende zu erhalten, setzen aber ihre Farben und Beschriftungen auf leere Werte, sodass Sie sie nicht in der Legende sehen können. Ich fand, dass ich auch override.aes=list(color="white") einschließen musste, um zu vermeiden, dass die leeren Legenden-Schlüsselkästen immer noch so leicht in der Legende sichtbar sind.

mtcars$cyl = factor(mtcars$cyl, levels=c(4, 11:15, 6, 16:20, 8)) 
cols = hcl(seq(15,375,length.out=4)[1:3], 100, 65) 

ggplot(mtcars, aes(cyl, fill=cyl)) + 
    geom_bar() + 
    coord_flip() + 
    scale_fill_manual(values=c(cols[1], rep("white",5), cols[2], rep("white",5), cols[3]), 
        labels=c(4, rep("",5), 6, rep("",5), 8), drop=FALSE) + 
    theme(legend.position = 'top') + 
    guides(fill = guide_legend(title=NULL, nrow=1, override.aes=list(color="white"))) 

enter image description here

1

Dies ist ein weiterer Hack, aber einen, den ich bevorzuge, da es zusätzlichen weißen Platz am Ende jedes Etiketts entsprechend seiner Anzahl an Zeichen hinzufügt. Ersetzen Sie fill = factor(cyl) durch

fill = sprintf("%-20s", factor(cyl)).

Dadurch werden alle Strings im Vektor mit weißen Zeichen auf der rechten Seite gefüllt, um insgesamt 20 Zeichen zu erreichen. Dies ist perfekt, wenn Sie unterschiedlich lange Textbeschriftungen haben. Sie können 20 zu der gewünschten Zahl ändern oder das negative Zeichen entfernen, um Leerzeichen auf der linken Seite anstelle der rechten hinzuzufügen. Im Allgemeinen ist sprintf() eine gute Funktion zum Erforschen und zum Formatieren von Text und Zahlen wie gewünscht.

Verwandte Themen