我用R绘制了六幅图。它们分为2行3列。 在所有这些图的底部,我想创建一个图例,其中包含四行,每行旁边都有一个名称,即
** ------- aaaaaaa ------- bbbbbbbbbbbbbbbbb ------- cccccc -------- dddddd **
但是,当我在图例中使用text.width函数时,我无法弄清楚如何计算text.width的值。如上所示,某些图例名称较长(例如,bbbbbbbbbbbbbbbbb),因此需要更多空间。
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
答案 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"))
根据上面的测试数据,这应该是
我试图尽可能少地改变所有其他正常的图例选项应该有效(希望如此)。
答案 1 :(得分:0)
就像这样:
labels<-c("GroupA","GroupB,C,D,E","GroupF", "GroupG")
strwidth(labels)