2016-09-17 15 views
4

Ich möchte eine horizontale Legende mit mehreren Zeilen mit der Basis R (nicht ggplot) erstellen. Es gibt eine Option für mehrere Spalten, aber nicht mehrere Zeilen in legende(). Gibt es eine Möglichkeit, dies zu tun? Beispiel um mit zu spielen wo die horizontale Legende es zu breit für die Handlung ist.Base R horizontale Legende - mit mehreren Zeilen

MyCol <- topo.colors(20) 
barplot(rep(1,20), yaxt="n", col=MyCol) 
x <- 1:20 
MyLab <- paste("Zone",x) 
legend("bottom",MyLab,fill=MyCol,horiz=T) 

Antwort

12

können Sie die ncol = Parameter das gewünschte Layout zu erhalten, anstatt horiz verwenden. Beachten Sie, dass horiz die ncol überschreibt, also nicht beide zusammen verwenden. Obwohl dies die Anzahl der Zeilen nicht direkt angibt, geschieht dies indirekt, da die Anzahl der Zeilen durch die Anzahl der Spalten und Faktoren bestimmt wird.

MyCol <- topo.colors(20) 
barplot(rep(1,20), yaxt="n", col=MyCol) 
x <- 1:20 
MyLab <- paste("Zone",x) 
legend("bottom",MyLab,fill=MyCol,ncol=5) 

enter image description here

Wenn Sie die Legendenelemente entlang Reihen geordnet zu gestalten, können Sie dies tun, um sie in der gewünschten Reihenfolge durch die Indizierung. Z.B.

MyOrder = as.vector(matrix(1:20, nrow = 4, ncol = 5, byrow = T)) 
legend("bottom",MyLab[MyOrder], fill=MyCol[MyOrder] ,ncol=5) 

enter image description here

für eine unterschiedliche Anzahl von Zeilen und Faktoren verallgemeinern, wir so etwas wie

Nfact = 21 
Nrows = 5 
Ncols = ceiling(Nfact/Nrows) 
MyOrder = as.vector(matrix(1:(Nrows*Ncols), nrow=Nrows, ncol=Ncols, byrow=T)) 

MyCol <- topo.colors(Nfact) 
x <- 1:Nfact 
MyLab <- paste("Zone",x) 

barplot(rep(1,Nfact), yaxt="n", col=MyCol) 
legend("bottom", MyLab[MyOrder], fill = MyCol[MyOrder], ncol = Ncols, border=NA) 

enter image description here

Und einen letzten Trick tun: In der vorherige Handlung, wir setzen die Grenze = NA. Auf diese Weise wird verhindert, dass um leere Legendenelemente (die am unteren Ende unvollständiger Spalten) Grenzen gezogen werden. Wenn Sie Rahmen möchten, sollten Sie auch einen Vektor mit Rahmenfarben erstellen, der NA nur an den Stellen ist, die wir nicht zeichnen möchten.

MyBorders = rep("black", Nrows*Ncols) 
MyBorders[MyOrder > Nfact] <- NA 
legend("bottom", MyLab[MyOrder], fill = MyCol[MyOrder], ncol = Ncols, border=MyBorders) 

enter image description here