2012-11-22 46 views
5

我在R中的圖例中有一個換行符,我的問題是圖形看起來不像預期的那樣。 我的小例子如下:R plot plot legend行中的linebreak

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

感謝@「馬克在框中」我找到了一個很好的工作解決方案。 禁用盒爲h Ë告訴與bty="n"然後

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) 

所以我首先計算右上角和數據點,並用此信息的多邊形後記畫之間的距離。 作品相當普遍,就我所見。

謝謝。

4

好的,我相信我有你的解決方案。我將圖例位置的信息保存在一個名爲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,旁邊= FALSE,xlim = range(0,100),ylim = range(0,12),horiz = TRUE) '而你的代碼只畫了一條實線。 – steffenmauch