これは、引数を渡すことでできると思われる最高の方法です。
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)
私はこの2番目のバージョンで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)