重ね描き data.frame

which使ってうまく色分けできそうな臭いがしてきたのですが

#####################
x<- matrix(a,100,4)

col=c("purple","green","orange","red")
cut<- c(1/4,2/4,3/4)

xxx<- as.data.frame(x[which(x[,4]<cut[1]),c(1:3)])
yyy<- as.data.frame(x[which(x[,4]>=cut[1] & x[,4]<cut[2]),c(1:3)])
zzz<- as.data.frame(x[which(x[,4]>=cut[2] & x[,4]<cut[3]),c(1:3)])
www<- as.data.frame(x[which(x[,4]>=cut[3]),c(1:3)])

#以下でなぜか重ね描きできない
plot(xxx,col=col[1])
par(new=T)
plot(yyy,col=col[2])
par(new=T)
plot(zzz,col=col[3])
par(new=T)
plot(www,col=col[4])
##########################

場合分けはうまくいっていると思うのですが、par(new=T)でdata.frameがずれてしまいます。
各々グラフ描出はできているのですが…
ここが越えられればプログラムを走らせることができるんですが…
むむむ。
  • これに対して。
  • まず、起きている現象は何かというと。
  • 掲載図にあるように、はじめのプロット(plot(xxx,...))では3x3プロットであるのに対して、par(new=T)後のプロット(plot(yyy,...))では3x3のうち、8画分のみが描かれていること。また、欠損しているのは、3x3で描かれるはずの最初のものであること。さらに、この重ね描きを行っていると、確かに、最初の画分が前の絵の(3,3)の位置に重ね描きされた後に、プロットデバイスが更新されて、まっさらなデバイス上に残りの8画分が描かれる様子も垣間見ることができます。
  • つまり、「重ね描き」は、3x3のうちの1つについてのみ実施されていることがわかります。
  • これを確かめるためにdata.frameをplotする、というのはどういう手続なのかを確かめることとします。
    • data.frameのplot()は以下のコマンドで示されるヘルプ記事にあるように
help(plot.data.frame)
This is intended for data frames with numeric columns. For more than two columns it first calls data.matrix to convert the data frame to a numeric matrix and then calls pairs to produce a scatterplot matrix).(ヘルプ記事引用)
    • data.frameのカラムのペアをpairs()関数を用いて作成した上で、それをNxNの枠に収めるという処理をしているようです
    • このNxNの枠に収めるときには、「重ね描き」をしていません。
    • 重ね描きをしないで分割プロットをした後に、「重ね描き」命令をして、また、重ね描きをしない分割プロットの命令を出していることになるようです。
    • 発生している現象は、このdata.frameのplot()処理から納得の行くものです
  • 起きていることとその原因はわかったので、今度は対策です。
    • data.frameのplot()は「重ね描き」をせずに、NxN個のプロットを分割領域に行う処理ですので、これに部分的に重ね描き命令をしてもだめです
    • 重ねたい絵を1つずつ描き、それを重ねつつ、次に行くしかなさそうです。
    • 以下のようにすると、重なるようです
a<-runif(100*4)
x<- matrix(a,100,4)

col=c("purple","green","orange","red")
cut<- c(1/4,2/4,3/4)

xxx<- as.data.frame(x[which(x[,4]<cut[1]),c(1:3)])
yyy<- as.data.frame(x[which(x[,4]>=cut[1] & x[,4]<cut[2]),c(1:3)])
zzz<- as.data.frame(x[which(x[,4]>=cut[2] & x[,4]<cut[3]),c(1:3)])
www<- as.data.frame(x[which(x[,4]>=cut[3]),c(1:3)])

# 組み合わせ
library(gtools)
cmb<-combinations(3,2)
xlim<-ylim<-c(0,1)

par(mfcol=c(3,3))
for(i in 1:length(cmb[,1])){
  plot(xxx[,cmb[i,1]],xxx[,cmb[i,2]],col=col[1],xlim=xlim,ylim=ylim)
  par(new=TRUE)
  plot(yyy[,cmb[i,1]],yyy[,cmb[i,2]],col=col[2],xlim=xlim,ylim=ylim)
  par(new=TRUE)
  plot(zzz[,cmb[i,1]],zzz[,cmb[i,2]],col=col[3],xlim=xlim,ylim=ylim)

}