我想在散点图矩阵中绘制两个不同的数据集.
我知道我可以使用upper.panel和lower.panel区分绘图功能.但是,我没有成功地将我的数据放入合适的格式来利用它.
假设我有两个组织("大脑"和"心脏")和四个条件(1-4).现在我可以使用eg pairs(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)))
Run Code Online (Sandbox Code Playgroud)
我如何将其转换为格式,以便pairs(data, …)绘制上面的一个数据集和对角线下面的一个数据集,如下所示(绿色=脑,紫色=心脏):

只是用
pairs(data, upper.panel = something, lower.panel = somethingElse)
Run Code Online (Sandbox Code Playgroud)
不起作用,因为这将绘制所有条件与所有条件,而不考虑不同的组织 - 它基本上忽略了列表,并且在重新排序层次结构时(即具有data = (A=list(brain=…, heart=…), B=list(brain=…, heart=…), …))也是如此.
这是我通过传递参数似乎能够做到的最好的事情:
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')
Run Code Online (Sandbox Code Playgroud)
请注意,每个面板都需要所有参数....是一个残酷的情妇.如果你在每个函数中只包含面板特定的参数,它似乎可以工作,但是你会从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)
Run Code Online (Sandbox Code Playgroud)

我在这第二个版本中滥用R的范围是一种有点丑陋的方式.(当然,你可以在格子中更干净地做到这一点,但你可能知道这一点.)
我能想到的唯一另一个选择是使用设计你自己的散点图矩阵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)
Run Code Online (Sandbox Code Playgroud)