GGPLOT

2013-03-18 4 views
5

kullanılarak nasıl yönlü ilişkilendirme oluşturulur? Aşağıdaki yolla oluşturulan bir veri çerçevem ​​var.GGPLOT

# 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.. 
:

enter image description here

Dolayısıyla yukarıdaki her faset aşağıdakilerden korelasyon arsa: Ben ne yapmak istiyorum

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") 

böyle kabaca görünen bir yönlü ggplot yaratmaktır

Ancak şu kodla takılıyorum:

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) 

Bunu yapmanın doğru yolu nedir?

+0

Ne istediğiniz arsa görüntü ile ilgisi var tip geliyor? Kullanışlı olabilecek bir ggpairs işlevine sahip ggAlly paketi vardır. Bu haliyle, örnek verileriniz ile istenen arsa arasındaki bağlantıyı görmek için uğraşıyorum. – mnel

+2

Verilerinizde olmayan mpg ve wt öğelerine atıfta bulunmanız özellikle kafa karıştırıcıdır – alexwhan

+0

Üzgünüz. Onu düzelttim. İşaret ettiğin için teşekkürler. – neversaint

cevap

8

Kodunuzun bir kısmı yanlıştı. OP'ın yorumun ve düzenleme sonrasında: Bu benim için çalışıyor:

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

Düzen. Buradaki fikir, verileri dört kombinasyonla ve sonra fasetle yeniden oluşturmaktır. Veri uygun biçimde değil beri çizilebilir önce

# 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

Oldukça değil. 2x2 ızgara oluşturmalı. Kombinasyon için çizimde * mavi * yazı tipine bakın. – neversaint

+3

Köşede ne istiyorsun? Nerede 'çizilmeye gerek yok' diyor - ama sizin diyagramınızda çizilir? – alexwhan

+0

Ben her gridde göstermek için bu diyagramda koydum, hangi değerler birleşimi korelasyon için kullanılır. – neversaint

3

, bazı yeniden şekillendirme gereklidir.

Öncelikle

, uzun biçimine veri yeniden şekillendirmek: type boyunca

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

Bölünmüş değerlerini ve val1 VS. val2:

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

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

tüm kombinasyonların bir listesini oluşturun

Yeni bir veri sayfası oluştur:

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})) 

Plot:

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