6

我想在散点图矩阵中绘制两个不同的数据集。

我知道我可以使用upper.panellower.panel区分绘图功能。但是,我没有成功地将我的数据以合适的格式来利用这一点。

假设我有两个组织(“大脑”和“心脏”)和四个条件(1-4)。现在我可以使用 egpairs(data$heart)来获取其中一个数据集的散点图矩阵。假设我有以下数据:

conditions <- 1 : 4
noise <- rnorm(100)
data <- list(brain = sapply(conditions, function (x) noise + 0.1 * rnorm(100)),
             heart = sapply(conditions, function (x) noise + 0.3 * rnorm(100)))

如何将其转换为一种格式,以便pairs(data, …)在对角线上方绘制一个数据集,在对角线下方绘制一个数据集,如下所示(绿色 = 大脑,紫色 = 心脏):

截屏

只是使用

pairs(data, upper.panel = something, lower.panel = somethingElse)

不起作用,因为这将在不考虑不同组织的情况下绘制所有条件与所有条件 - 它基本上忽略列表,并且在重新排序层次结构时相同(即具有data = (A=list(brain=…, heart=…), B=list(brain=…, heart=…), …))。

4

1 回答 1

7

这是我似乎能够通过传递参数做的最好的事情:

foo.upper <- function(x,y,ind.upper,col.upper,ind.lower,col.lower,...){
    points(x[ind.upper],y[ind.upper],col = col.upper,...)
}

foo.lower <- function(x,y,ind.lower,col.lower,ind.upper,col.upper,...){
    points(x[ind.lower],y[ind.lower],col = col.lower,...)
}

pairs(dat[,-5],
        lower.panel = foo.lower,
        upper.panel = foo.upper,
        ind.upper = dat$type == 'brain',
        ind.lower = dat$type == 'heart',
        col.upper = 'blue',
        col.lower = 'red')

请注意,每个面板都需要所有参数。...是个残忍的情妇。如果您在每个函数中仅包含特定于面板的参数,它似乎可以工作,但是您会从 R 中得到很多警告,试图将这些参数传递给常规绘图函数,显然它们不会存在。

这是我的第一次快速尝试,但看起来很难看:

dat <- as.data.frame(do.call(rbind,data))
dat$type <- rep(c('brain','heart'),each = 100)

foo.upper <- function(x,y,...){
    points(x[dat$type == 'brain'],y[dat$type == 'brain'],col = 'red',...)
}

foo.lower <- function(x,y,...){
    points(x[dat$type == 'heart'],y[dat$type == 'heart'],col = 'blue',...)
}

pairs(dat[,-5],lower.panel = foo.lower,upper.panel = foo.upper)

在此处输入图像描述

我在第二个版本中以一种有点丑陋的方式滥用了 R 的范围。(当然,您可以在lattice中更干净地执行此操作,但您可能知道这一点。)

我能想到的唯一其他选择是使用 设计您自己的散点图矩阵layout,但这可能需要相当多的工作。

格子编辑

这至少是一个格子解决方案的开始。它应该更好地处理不同的 x,y 轴范围,但我还没有测试过。

dat <- do.call(rbind,data)
dat <- as.data.frame(dat)
dat$grp <- rep(letters[1:2],each = 100)

plower <- function(x,y,grp,...){
    panel.xyplot(x[grp == 'a'],y[grp == 'a'],col = 'red',...)
}

pupper <- function(x,y,grp,...){
    panel.xyplot(x[grp == 'b'],y[grp == 'b'],...)
}

splom(~dat[,1:4],
        data = dat,
        lower.panel = plower,
        upper.panel = pupper,
        grp = dat$grp)
于 2013-03-25T22:29:34.073 回答