2012-11-22 49 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