调整基本图形图例标签宽度

时间:2014-07-24 12:27:44

标签: r legend

我用R绘制了六幅图。它们分为2行3列。 在所有这些图的底部,我想创建一个图例,其中包含四行,每行旁边都有一个名称,即

** ------- aaaaaaa ------- bbbbbbbbbbbbbbbbb ------- cccccc -------- dddddd **

但是,当我在图例中使用text.width函数时,我无法弄清楚如何计算text.width的值。如上所示,某些图例名称较长(例如,bbbbbbbbbbbbbbbbb),因此需要更多空间。

R代码:

par(mfrow=c(2,3),mar=c(4.5,4,1,1),oma=c(2,0,0,0)) #Setting the margins


plot(1,1,xlim=c(5,10.7),ylim=c(15,25))
plot(1,1,xlim=c(5,10.7),ylim=c(45,70))
plot(1,1,xlim=c(5,10.7),ylim=c(20,33))
plot(1,1,xlim=c(5,10.7),ylim=c(15,25))
plot(1,1,xlim=c(5,10.7),ylim=c(45,70))
plot(1,1,xlim=c(5,10.7),ylim=c(20,33))  # plot six graphs

labels<-c("aaaaa","bbbbbbbbbbbbbbbbbbbbbbb","ccccccccccc", "ddddd")  #legend labels
colour<-c("red","black","dark green","blue")#legend line colours

par(fig = c(0, 1, 0, 1), oma = c(0, 0, 0, 0), mar = c(0, 0, 0, 0), new = TRUE) 
plot(0, 0, type = "n", bty = "n", xaxt = "n", yaxt = "n")## create an empty plot

legend("bottom", lty=1,lwd=1.5,ncol=4,labels,cex=1,
col=colour,bg="white",pt.cex=1,bty="n",text.width=c(0.2,0.2,0.2,0.2)) ## creating legend

2 个答案:

答案 0 :(得分:2)

所以这有点棘手,因为虽然legend接受了w0不同长度的向量,但它实际上并不喜欢它。它期望text.width是单个值。因此,我尝试进行少量的黑客攻击以使其发挥作用。这有点乱,只在R version 3.0.2进行了测试。但我们需要改变两条线

body(legend)[[c(38,4,6)]]
# w <- ncol * w0 + 0.5 * xchar
body(legend)[[40]]
# xt <- left + xchar + xextra + (w0 * rep.int(0:(ncol - 1), 
#   rep.int(n.legpercol, ncol)))[1L:n.leg]

我会确保你在运行这些命令时得到相同的结果,否则这个黑客不会工作,可能会改变其他重要的代码。无论如何,让我们通过我们的更改创建我们自己的图例版本

legend2 <- legend
body(legend2)[[c(38,4,6)]] <- quote({
    cidx <- col(matrix(1, ncol=ncol, nrow=n.legpercol))[1:n.leg]
    wc <- tapply(rep_len(w0,n.leg), cidx, max)
    w <- sum(wc) + 0.5 * xchar
    w0 <- rep(cumsum(c(0,wc[-length(wc)])), each=n.legpercol)[1:n.leg]
})
body(legend2)[[40]] <- quote(xt <- left + xchar + xextra + w0)

因此,如果每个标签的长度不同,那么很多只是重塑这些值才有意义。进行了额外的工作以确保图例的列仍然具有相同的宽度(最长元素的宽度)。您应该可以使用此新版本更换legend()来电,但请务必按​​以下方式添加text.width

legend2("bottom", lty=1,lwd=1.5,ncol=4,labels,cex=1,
  col=colour,bg="white",pt.cex=1,bty="n",
  text.width=strwidth(labels, units="user"))

根据上面的测试数据,这应该是

enter image description here

我试图尽可能少地改变所有其他正常的图例选项应该有效(希望如此)。

答案 1 :(得分:0)

就像这样:

labels<-c("GroupA","GroupB,C,D,E","GroupF", "GroupG")
strwidth(labels)