【问题标题】:Adjusting base graphics legend label width调整基本图形图例标签宽度
【发布时间】:2014-07-24 12:27:44
【问题描述】:

我使用 R 绘制了六个图表。它们被排列成 2 行和 3 列。 在所有这些图表的底部,我想创建一个包含四行的图例,每行旁边都有一个名称,即

**------- aaaaaaa -------bbbbbbbbbbbbbbbbbb -------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

【问题讨论】:

  • 您提供的代码不会创建绘图。如果问题不容易重现,则很难帮助绘制代码。它可以像plot(1,1) 一样简单,但要确保所有变量都已定义。
  • 抱歉代码不清楚。我现在已经编辑了我的问题。

标签: r legend


【解决方案1】:

所以这有点棘手,因为虽然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]

我会确保你在运行这些命令时得到相同的结果,否则这个 hack 将不起作用并且可能会更改其他重要代码。不管怎样,让我们​​用我们的改变来创建我们自己的传奇版本

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"))

有了上面的测试数据,应该是这样的

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

【讨论】:

  • 非常感谢!!!这正是我需要的!!只是想知道 - 如果我想将标签更改为仅标签 a、b 和 c,我该怎么做?或者如果上面的六张图有不同的尺度(即xlim、ylim),代码会不一样吗?
  • 如果只想标注a、b、c;只是不要将它们全部传递给legend()。只传入要在图例中绘制的值。如果您有不同的比例,则无需更改代码。它的行为应该像标准的legend()
  • 我刚刚在几个图表上尝试过这个,它们工作得很好。非常感谢!!!!
【解决方案2】:

例如这样:

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

【讨论】:

  • 我确实尝试将宽度值放入 text.width=() 但每个标签之间的间距仍然存在问题
猜你喜欢
  • 2013-04-30
  • 1970-01-01
  • 2020-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多