2013-03-18 16 views
5

データフレームは次のように作成されています。私が何をしたいかGGPLOTを使用して面取りされた相関プロットを作成する方法

library(ggplot2) 

x <- data.frame(letters[1:10],abs(rnorm(10)),abs(rnorm(10)),type="x") 
y <- data.frame(letters[1:10],abs(rnorm(10)),abs(rnorm(10)),type="y") 
# in reality the number of row could be larger than 10 for each x and y 

all <- rbind(x,y) 
colnames(all) <- c("name","val1","val2","type") 

は、おおよそ次のようになります多面的なggplot作成することです:

enter image description here

を従って、上記の各ファセットは、以下の相関プロットである:

# Top left facet 
subset(all,type=="x")$val1 
subset(all,type=="y")$val1 

# Top right facet 
subset(all,type=="x")$val1 
subset(all,type=="y")$val2 

# ...etc.. 

しかし、私は次のコードがついています:

p <- ggplot(all, aes(val1, val2))+ geom_smooth(method = "lm") + geom_point() + 
facet_grid(type ~) 
# Calculate correlation for each group 
cors <- ddply(all, c(type ~), summarise, cor = round(cor(val1, val2), 2)) 
p + geom_text(data=cors, aes(label=paste("r=", cor, sep="")), x=0.5, y=0.5) 

これは正しい方法はありますか?

+0

タイプは、ご希望のプロット画像としなければなりませんか?有用なggpairs関数を持つggAllyパッケージがあります。それは私があなたのサンプルデータと所望のプロットとの間の接続を見るのに苦労しています。 – mnel

+2

あなたのデータにないmpgとwtを参照するのは特に紛らわしいです – alexwhan

+0

申し訳ありません。私はそれを修正しました。それを指摘してくれてありがとう。 – neversaint

答えて

8

コードの一部が正しくありませんでした。これは私の作品:

p <- ggplot(all, aes(val1, val2))+ geom_smooth(method = "lm") + geom_point() + 
    facet_grid(~type) 
# Calculate correlation for each group 
cors <- ddply(all, .(type), summarise, cor = round(cor(val1, val2), 2)) 
p + geom_text(data=cors, aes(label=paste("r=", cor, sep="")), x=1, y=-0.25) 

enter image description here

編集:OPさんのコメントと編集後。アイデアは、4つのすべての組み合わせとファセットでデータを再作成することです。

# I consider the type in your previous data to be xx and yy 
dat <- data.frame(val1 = c(rep(all$val1[all$type == "x"], 2), 
          rep(all$val1[all$type == "y"], 2)), 
        val2 = rep(all$val2, 2), 
        grp1 = rep(c("x", "x", "y", "y"), each=10), 
        grp2 = rep(c("x", "y", "x", "y"), each=10)) 

p <- ggplot(dat, aes(val1, val2)) + geom_point() + geom_smooth(method = "lm") + 
    facet_grid(grp1 ~ grp2) 
cors <- ddply(dat, .(grp1, grp2), summarise, cor = round(cor(val1, val2), 2)) 
p + geom_text(data=cors, aes(label=paste("r=", cor, sep="")), x=1, y=-0.25) 

enter image description here

+0

それは2x2グリッドを作成する必要があります。その組み合わせについては、図の* blue * fontを参照してください。 – neversaint

+3

それで、あなたは対角線で何をしたいですか? 「プロットする必要はありません」と言われていますが、それはあなたの図にプロットされていますか? – alexwhan

+0

私は、各グリッドにどの値の組み合わせが相関関係に使用されているかを示すために、この図を示します。 – neversaint

3

データが適切な形式ではないので、それをプロットすることができます前に、いくつかの整形が必要です。

まず、長い形式にデータを再構築:

library(reshape2) 
allM <- melt(all[-1], id.vars = "type") 

スプリットtypeval1val2に沿っ値:

allList <- split(allM$value, interaction(allM$type, allM$variable)) 

は、すべての組み合わせのリストを作成します。

allComb <- unlist(lapply(c(1, 3), 
        function(x) 
        lapply(c(2 ,4), 
          function(y) 
          do.call(cbind, allList[c(x, y)]))), 
      recursive = FALSE) 

新しいデータセットを作成:

allNew <- do.call(rbind, 
        lapply(allComb, function(x) { 
            tmp <- as.data.frame(x) 
            tmp <- (within(tmp, {xval <- names(tmp)[1]; 
                 yval <- names(tmp)[2]})) 
            names(tmp)[1:2] <- c("x", "y") 
            tmp})) 

プロット:

library(ggplot2) 
p <- ggplot(allNew, aes(x = x, y = y)) + 
     geom_smooth(method = "lm") + 
     geom_point() + 
     facet_grid(yval ~ xval) 
# Calculate correlation for each group 
library(plyr) 
cors <- ddply(allNew, .(yval, xval), summarise, cor = round(cor(x, y), 2)) 
p + geom_text(data=cors, aes(label=paste("r=", cor, sep="")), x=0.5, y=0.5) 

enter image description here

関連する問題