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)
})
我有一个 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)
})