6

我在 R 的图例中有一个换行符,我的问题是图形看起来不像预期的那样。我的最小示例如下:

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

我希望图例的上下边距相等,但事实并非如此。在此处输入图像描述

正如您在附图中看到的那样,下边距小于上边距。

有谁知道如何解决它,或者谁能告诉我问题是什么?

谢谢。

4

2 回答 2

4

好的,我相信我有一个解决方案给你。我将图例位置的信息保存在一个名为的对象中ld,然后polygon根据这些坐标创建一个。理解起来有点棘手,但我基本上是将多边形扩展了几个点大小的长度。为了做到这一点,我必须首先获得以英寸为单位的字符大小,par()$cin并将点大小转换为这些尺寸(除以 72 并乘以par()$ps。然后,通过缩放将其转换为绘图单位par()$usr以获得字符宽度单位(我认为这是正确的 - 在任何情况下它都有效!)。我在ld坐标的左侧添加了 3 个单位,在右侧添加了 2 个,向上添加了 1 个,向下添加了 1 个。这是结果和代码:

在此处输入图像描述

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])
)
于 2012-11-23T08:53:49.703 回答
2

感谢@'Marc in the box',我找到了一个很好的解决方案。按照他的说法禁用盒子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)

所以我首先计算了顶角和 dataPoint 之间的距离,然后用这个信息绘制一个多边形。据我所见,作品相当普遍。

谢谢。

于 2012-11-23T13:10:44.970 回答