通过面板为基本 R 对()图指定单色?

问题描述 投票:0回答:2

我想知道是否有一种方法可以使用基本 R

pairs()
图的自定义面板功能将散点图点颜色分配给特定面板?有很多按因素在每个面板中着色的示例,但我找不到任何可以将单一颜色分配给给定面板中的所有点,并将不同颜色分配给另一个面板中的点的任何东西。可能有一些巧妙的方法可以通过访问成对列组合的索引并让
pairs()
将其传递给自定义面板函数来完成,但我无法弄清楚。

r plot visualization
2个回答
1
投票

这是一个可怕的黑客,但你可以通过在调用堆栈中搜索当前面板的行/列索引来做到这一点......

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))
来解决这个问题...


0
投票

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
)

© www.soinside.com 2019 - 2024. All rights reserved.