2012-11-22 19 views
5

Rの凡例に改行があります。私の問題は、グラフィックが期待通りに見えないことです。次のように 私の最低限の例は次のとおりです。Rの改行プロットの凡例の動作

plot(1) 
legendLabel<-c("t\nu ","tu","wh","trr\nni") 
legend("top",legend=legendLabel,horiz=TRUE,fill=c("red","blue","gray","black")) 

私は伝説の上下のマージンが同じであるが、これはそうではないことを期待します。 enter image description here

添付の画像でわかるように、下の余白は上端より小さくなります。

誰かがそれを修正する方法を知っていますか、誰かが問題の内容を教えてもらえますか?

ありがとうございました。

+1

私もあきらめます。あなたは 'bty ​​=" n "'でボックスを削除し、その後に 'polygon'を追加したいかもしれません。 –

答えて

2

'ボックス内のMarc' @のおかげで私は良い実用的なソリューションを見つけました。 hとボックスを無効にしますeはだから私は最初上隅とデータポイント間の距離を計算し、あとがきこの情報ポリゴンで描画

ld<-legend("top",legend=legendLabel, cex=0.65, fill=colorNames, horiz=TRUE,bty="n") 
    height<-(ld$rect$top-ld$text$y[1])*2 
    xs <- c(ld$rect$left, ld$rect$left, ld$rect$left+ld$rect$w, ld$rect$left+ld$rect$w) 
    ys <- c(ld$rect$top, ld$rect$top-height, ld$rect$top-height, ld$rect$top) 
    polygon(x = xs , y = ys) 

その後、 bty="n"と語ったと。 かなり一般的な作品は、私が見た限りです。

ありがとうございました。

4

OK、私はあなたに解決策があると思います。凡例の位置の情報をldというオブジェクトに保存してから、これらの座標に基づいてpolygonを作成しました。理解するのはちょっと難しいですが、基本的にポリゴンをいくつかのポイントの長さに拡大しています。これを行うには、最初にpar()$cinで文字サイズをインチで取得し、ポイントサイズをこれらのディメンションに変換する必要がありました(72で割り、par()$psを掛けてから、par()$usrでスケーリングしてこれをプロットの単位に変換します) (私はこれが正しいと思います - どんな場合でも動作します!)ldの座標の左側にこれらのユニットを3つ追加しました。右に2、右に1、上に1があります。

enter image description here

plot(1) 
legendLabel<-c("t\nu ","tu","wh","trr\nni") 
ld <- legend("top",legend=legendLabel,horiz=TRUE,fill=c("red","blue","gray","black"), bty="n") 

CIN <- par()$cin 
PS <- par()$ps 
USR <- par()$usr 
CIN.USR <- c((CIN[1]/72*PS)/(USR[2]-USR[1]), (CIN[2]/72*PS)/(USR[4]-USR[3])) 

xs <- c(ld$text$x[1], ld$text$x[1], ld$text$x[length(ld$text$x)], ld$text$x[length(ld$text$x)]) 
ys <- c(ld$text$y[1], ld$text$y[1], ld$text$y[length(ld$text$x)], ld$text$y[length(ld$text$x)]) 

polygon(
x = xs + c(-3*CIN.USR[1], -3*CIN.USR[1], 2*CIN.USR[1], 2*CIN.USR[1]), 
y = ys+c(-1*CIN.USR[2], 1*CIN.USR[2], 1*CIN.USR[2], -1*CIN.USR[2]) 
) 
+0

あなたの答えに感謝して、あなたのことに基づいて、私のために働く解決策を見つけました。あなたの問題は、barplot(matrix(data、nr = 6)、names.arg = name、beside = FALSE、xlim = range(0,100)、ylim = range(0,12)、horiz = TRUE) 'あなたのコードは実線のみを描画します。 – steffenmauch

関連する問題