R:具有不止一种颜色的图例框

R: legend boxes with more than one colour

我有一个 plot() ,其中多个颜色阴影代表同一事物。我想添加一个图例,通过双色框来传达这一点(请参见下面的示例)。有没有办法使用 legend() 或类似的命令来做到这一点?或者,有没有办法确定这些框的精确坐标,以便我可以在其上绘制一个 polygon() 三角形?

注意:legend() return 外框的坐标和每个标签的左上角,但我不确定这是否足以计算彩色框的位置。

这有点乱七八糟,但您可以将两个图例放在另一个图例之上。不幸的是,没有左三角形 pch 完全符合您的要求。

plot(1)
legend("bottomright",c("Label 1", "Label 2"),pch=22,col=c("red","blue"),pt.bg=c("red","blue"), pt.cex=1.8)
legend("bottomright",c("Label 1", "Label 2"),pch=21,col=c("green","orange"),pt.bg=c("green","orange"))

一个稍微肮脏的 hack 可以让您获得 legend() 函数来为您提供必要的信息。比我聪明的人可能会弄清楚 legend() 如何计算盒子定位并在函数外复制它。请注意,可能不建议编辑标准 R 函数。

如果您还没有编辑 R 函数,一个简单(临时)的访问方法是输入

fix(legend)

打字

rm(legend)

稍后将撤消您的更改。

找到写着 fill <- rep 的部分并添加注释指示的行:

    fillList <- NULL ## added
    if (mfill) {
        if (plot) {
            fill <- rep(fill, length.out = n.leg)
            rect2(left = xt, top = yt + ybox/2, dx = xbox, dy = ybox, 
                col = fill, density = density, angle = angle, 
                border = border)
            fillList <- data.frame(left = xt, top = yt + ybox/2, dx = xbox, dy = ybox) ## added
        }
        xt <- xt + dx.fill
    }

找到最后一行并将其更改为

    invisible(list(rect = list(w = w, h = h, left = left, top = top), 
        text = list(x = xt, y = yt), fillList=fillList)) ## modified

现在通过

调用图例
output <- legend(...) ## replace ... with whatever you want to have as inputs

然后使用 legend() 返回的信息绘制三角形,如下所示:

    with(output$fillList[1,], { ## first box
        polygon(c(left, left+dx, left+dx), c(top, top, top-dy), col=myColour, border=NA)
    })