2011-06-21 9 views
13

と仮定私は、次のようなデータを持っています。私がする必要がある場合は、文字列を短縮するために文字列を省略することができますが、複数の行や列に凡例を 'ラップする'ことが可能かどうかは疑問でした(ほとんどの場合gridの魔法を使用します)。例えば、私は水平に、下部に凡例を配置すると言う:ラップ水平伝説が

ggplot(dat,aes(x=x,y=y,colour=grp)) + geom_point() + 
     opts(legend.position="bottom",legend.direction="horizontal") 

それは、この伝説は、3の2行ではなく、6の1行として表示するために取得することはできますか?

+2

それはあなたが求めているものではありませんが、その 'ラボ<見つけるかもしれない - 「!本当に\ nreally長いの\ nstring」。'または類似のもので伝説に合う助けるかもしれない – Henry

+0

私だけのために懇願しましたこれはGitHub上で、あなたがfacet_wrapを提案した後で、私は空白の中の伝説が欲しく、2行または2列でなければならないからです。 –

答えて

5

長い文字列をラップするには、strwrapを使用します。

lipsum <- "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur ullamcorper tellus vitae libero placerat aliquet egestas tortor semper. Maecenas pellentesque euismod tristique. Donec semper interdum magna, commodo vehicula ante hendrerit vitae. Maecenas at diam sollicitudin magna mollis lobortis. In nibh elit, tincidunt eu lobortis ac, molestie a felis. Proin turpis leo, iaculis non commodo quis, venenatis at justo. Duis in magna vel erat fringilla gravida quis non nisl. Nunc lacus magna, varius eu luctus vel, luctus tristique sapien. Suspendisse mi dolor, vestibulum at facilisis elementum, lacinia vitae metus. Etiam ut nisl urna, vel tempus mi. In hac habitasse platea dictumst. Quisque pretium volutpat felis, nec tempor diam faucibus at. Praesent volutpat posuere sapien, eu vulputate risus molestie vitae. Proin iaculis quam non leo porttitor hendrerit." 

strwrap(lipsum) 
cat(strwrap(lipsum), sep = "\n") 
# Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur ullamcorper tellus 
# vitae libero placerat aliquet egestas tortor semper. Maecenas pellentesque euismod 
# tristique. Donec semper interdum magna, commodo vehicula ante hendrerit vitae. Maecenas 
# at diam sollicitudin magna mollis lobortis. In nibh elit, tincidunt eu lobortis ac, 
# molestie a felis. Proin turpis leo, iaculis non commodo quis, venenatis at justo. Duis 
# in magna vel erat fringilla gravida quis non nisl. Nunc lacus magna, varius eu luctus 
# vel, luctus tristique sapien. Suspendisse mi dolor, vestibulum at facilisis elementum, 
# lacinia vitae metus. Etiam ut nisl urna, vel tempus mi. In hac habitasse platea 
# dictumst. Quisque pretium volutpat felis, nec tempor diam faucibus at. Praesent 
# volutpat posuere sapien, eu vulputate risus molestie vitae. Proin iaculis quam non leo 
# porttitor hendrerit. 
+1

Sigh。 – joran

5

これを試してください。私は非常に長いタイトルのためにこれを書いたが、それは長い文字列のために働く。 あなたのインスタンスの長さはまだ分かります。

# splits title of plot if to long 
splittitle=function(title,linelength=40) 
{ 
    spltitle<-strsplit(title,' ') 
    splt<-as.data.frame(spltitle) 
    title2<-NULL 
    title3<-NULL 
    titlelength<-round(nchar(title)/round(nchar(title)/linelength)) 
    dimsplt<-dim(splt) 
    n=1 
    doonce2=0 
    for(m in 1:round(nchar(title)/linelength)){ 
    doonce=0 
    doonce2=0 
    for(l in n:dimsplt[1]){ 
     if(doonce==0){title2<-title3} 
     title2=paste(title2,splt[l,],sep=' ') 
     if(doonce2==0){if(nchar(title2)>=(titlelength*m)){title3=paste(title2,'\n',sep='') 
     n<-(l+1) 
     doonce2=1} 
     } 
     doonce=1 
    } 
    } 
    title2 
} 

lab <- "A really really long string!A really really long string!A really really long string!A really really long string!A really really long string!A really really long string!A really really long string!A really really long string!" 
lab2<-splittitle(lab) 
cat(lab) 
cat(lab2) 


library('ggplot2') 

1オリジナル

dat <- data.frame(grp = paste(1:6,lab2),x=1:6,y=runif(6)) 

ggplot(dat,aes(x=x,y=y,colour=grp)) + geom_point() + 
    opts(legend.position="bottom",legend.direction="horizontal") 

2 splittitle

dat <- data.frame(grp = paste(1:6,lab2),x=1:6,y=runif(6)) 
ggplot(dat,aes(x=x,y=y,colour=grp)) + geom_point() + 
    opts(legend.position="bottom",legend.direction="horizontal") 
+0

+1長い文字列を分割するための便利なコードです。 – joran

2

前述splittitle ほぼ作品を使用して、しかし例えば

> splittitle("abc defg hi jkl m", 6)
012そう[1] " abc defg\n hi\n jkl m"

が本当に何をしたいあなたを与えるものではありません...

1つのトリックは、(改行を挿入することで)複数行に単一の文字列を分割した

RGraphics::splitStringを使用することです 出力が現在のビューポートに収まるようにします。

次に、ビューポートを一時的に変更するだけです。以下の機能は私のためのトリックでしたが、まだ迅速な&ダーティーソルトです。私は伝説のタイトルを包むためにそれを使用しました。

library(RGraphics) 
multiLines <- function(text, maxWidth=11) { 
    textLen = nchar(text) 
    maxHeight = ceiling(textLen/maxWidth)*1.5 
    vp=viewport(width=maxWidth,height=maxHeight, default.units="char") 
    pushViewport(vp) #activate the viewport 
    text2 = splitString(text) #given vp, split the text 
    popViewport() #get rid of it 
    return(text2) 
}