2016-09-17 21 views
4

ベースR(ggplotではなく)を使用して複数の行で水平凡例を作成したいとします。 凡例()内に複数の列はありませんが、複数の行は表示されません。これを行う方法はありますか?水平の凡例がプロットのために広すぎる場所で演奏する例。ベース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 =パラメータを使用することができます。 horizncolを上書きするため、両方を同時に使用しないでください。これは行の数を直接指定するものではありませんが、行の数は列と要素の数によって決定されるため、間接的に行の数を指定します。

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

関連する問題