6

散布図行列に2つの異なるデータセットをプロットしたいと思います。

プロット関数upper.panelを使用しlower.panelて区別できることを知っています。ただし、これを利用するのに適した形式でデータを配置することはできません。

2つの組織(「脳」と「心臓」)と4つの状態(1〜4)があると仮定します。pairs(data$heart)これで、たとえば、データセットの1つの散布図行列を取得するために使用できます。次のデータがあると仮定します。

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, …)ここに示すように、これを対角線の上と下に1つのデータセットをプロットする形式にするにはどうすればよいですか(緑=脳、紫=心臓):

スクリーンショット

使用するだけ

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)

ここに画像の説明を入力してください

私はこの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)
于 2013-03-25T22:29:34.073 に答える