2012-04-20 28 views
2

可能なすべての変数の組み合わせについてグラフをプロットしたい。私のコードは以下の通りです:ggplot2:可能なすべての変数の組み合わせの散布図

set.seed(12345) 
a <- data.frame(Glabel=LETTERS[1:7], A=rnorm(7, mean = 0, sd = 1), B=rnorm(7, mean = 0, sd = 1), C=rnorm(7, mean = 0, sd = 1)) 
T <- data.frame(Tlabel=LETTERS[11:20], A=rnorm(10, mean = 0, sd = 1), B=rnorm(10, mean = 0, sd = 1), C=rnorm(10, mean = 0, sd = 1)) 

library(ggplot2) 
for(i in 2:(ncol(a)-1)) 
{ 
for(j in (i+1):ncol(a)) 
{ 
    r <- 0.08 
    p <- ggplot(data=a, mapping=aes(x=a[, i], y=a[, j])) + geom_point() + theme_bw() 
    p <- p + geom_text(data=a, mapping=aes(x=a[, i], y=a[, j], label=Glabel), 
       size=3, vjust=1.35, colour="black") 
    p <- p + geom_segment(data = T, aes(xend = T[ ,i], yend=T[ ,j]), 
        x=0, y=0, colour="black", 
        arrow=arrow(angle=25, length=unit(0.25, "cm"))) 
    p <- p + geom_text(data=T, aes(x=T[ ,i], y=T[ ,j], label=Tlabel), size=3, vjust=0, colour="red") 
dev.new() 
    print(p) 
} 
} 

このコードはうまくいきます。しかし、ここで使用されている方法は推奨されておらず(See @baptiste comment)、機能しません。私はこの仕事を達成するための最良で推奨される方法が何かを知りたい。あなたの助けを前にありがとう。

+2

あなたはGGallyパッケージからggpairsで見たことがありますか? – joran

+0

@ジョランそれは良い考えですが、この質問自体はかなり面白いです。私はかなり簡単に閉じることができますが、ggplotはデータセットのオブジェクトを提供する必要があり、私はそれをラップするたびに関数呼び出しの中で非効率的に偽のデータセットを作ることができません。 –

+1

あなたはおそらく以下の私の回答を使用して、あなたが追加したものを置くことができます。あなたがあなたのスレッドで編集したと言っているのでなければ、 。 –

答えて

3

申し訳ありませんが、これはごみですが、私ができることは最高です。 lapplyを介して各ループの部分データを再作成するので、非常に非効率です。たぶん他の誰かがもっと良いものを持っています

MAT <- outer(names(df)[-1], names(df)[-1], paste) 
combs <- sapply(MAT[lower.tri(MAT)], function(x) strsplit(x, " ")) 
ind <- lapply(combs, function(x) match(x, names(df))) 

plotter <- function(cn) { #start junky function 
    NAMES <- colnames(df)[cn] 
    df2 <- df[cn] 
    names(df2)<- c('x1', 'x2') 
    p <- ggplot(data=df2, aes(x1, x2)) + geom_point() + theme_bw() + 
     scale_x_continuous(name=NAMES[1]) + 
     scale_y_continuous(name=NAMES[2]) 
     dev.new() 
     print(p) 
} #end of junky function 

lapply(ind, function(x) plotter(cn=x)) 

EDIT:これは少し良いです:

x <- match(names(df)[-1], names(df)) 
MAT <- outer(x, x, paste) 
combs <- t(sapply(MAT[lower.tri(MAT)], function(x) as.numeric(unlist(strsplit(x, " "))))) 

plotter <- function(cn) { 
    NAMES <- colnames(df)[cn] 
    df2 <- df[cn] 
    names(df2)<- c('x1', 'x2') 
    p <- ggplot(data=df2, aes(x1, x2)) + geom_point() + theme_bw() + 
     scale_x_continuous(name=NAMES[1]) + 
     scale_y_continuous(name=NAMES[2]) 
     dev.new() 
     print(p) 
} 

apply(combs, 1, function(x) plotter(cn=x)) 
+0

あなたの答えをありがとう。私はあなたが答えを投稿するときに編集していました。私の編集した質問を見てください。ありがとう – MYaseen208

関連する問題