我想知道是否有一种方法可以使用基本 R
pairs()
图的自定义面板功能将散点图点颜色分配给特定面板?有很多按因素在每个面板中着色的示例,但我找不到任何可以将单一颜色分配给给定面板中的所有点,并将不同颜色分配给另一个面板中的点的任何东西。可能有一些巧妙的方法可以通过访问成对列组合的索引并让 pairs()
将其传递给自定义面板函数来完成,但我无法弄清楚。
这是一个可怕的黑客,但你可以通过在调用堆栈中搜索当前面板的行/列索引来做到这一点......
pp <- function(x, y) {
## extract panel indices
i <- parent.frame(2)$i
j <- parent.frame(2)$j
col <- if (i==1 && j == 3) "red" else "black"
points(x, y, col = col)
}
pairs(mtcars[,1:5], panel = pp, gap = 0)
parent.frame(2)
在做什么?这是调用 pp
时的调用堆栈(通过说 debug(pp)
,然后从调试环境中发出 where
):
where 1: upper.panel(...)
where 2: localUpperPanel(as.vector(x[, j]), as.vector(x[, i]), ...)
where 3: pairs.default(mtcars[, 1:5], panel = pp, gap = 0)
where 4: pairs(mtcars[, 1:5], panel = pp, gap = 0)
parent.frame(2)
表示“检索调用堆栈上两步的环境”,即 pairs.default
的环境。 pairs.default
在行 (for
) 和列 (i
) 索引上运行 j
循环,因此我们可以从该环境中检索这些索引的当前值。我通过在我的 browser()
函数中放置一个 panel
语句,然后检查上一级环境的内容(ls(parent.frame(1))
),没有找到任何看起来像行/列索引的内容,并尝试 ls(parent.frame(2))
来解决这个问题...
与
pairs
我不知道。但您可以使用 GGally 包来绘制自定义绘图矩阵。这是一个不完整的例子:
library(GGally)
gg1 <- ggplot(iris, aes(x = Sepal.Length, y = Petal.Length)) +
geom_point(col = "red")
gg2 <- ggplot() + geom_blank()
gg3 <- ggplot(iris, aes(x = Sepal.Length, y = Petal.Width)) +
geom_point(col = "blue")
gg4 <- ggplot(iris, aes(x = Sepal.Width, y = Petal.Width)) +
geom_point(col = "green")
ggmatrix(
list(gg1, gg2, gg3, gg4),
2, 2,
c("Sepal.Length", "Sepal.Width"),
c("Petal.Length", "Petal.Width"),
byrow = TRUE
)