2016-09-17 58 views
4

我希望使用基R(不是ggplot)創建具有多行的水平圖例。 在圖例()中有多個列但不包含多行的選項。有沒有辦法做到這一點?例如在下面玩水平傳說它太劇烈的情節。Base R水平圖例 - 多行

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) 

回答

12

你可以用它代替horizncol =參數來獲取你想要的佈局。請注意0​​覆蓋ncol,所以不要一起使用兩者。儘管這並沒有直接指定行數,但它的確是間接的,因爲行數由列數和因子決定。

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

如果要排列沿行訂購的傳奇物品,你可以通過在你想要的順序索引他們做到這一點。例如。

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

要概括爲不同數量的行和因素,我們可以做這樣的事情

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

而且最終額外的竅門:在前面的情節,我們設置border = NA。這是爲了防止圍繞空的圖例項目(不完整列底部的)繪製邊框。如果你想要邊框,那麼我們也應該創建一個只有在我們不想繪製的位置上的邊框顏色矢量NA

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

enter image description here