2013-03-18 17 views
5

Mam ramkę danych utworzoną w następujący sposób.Tworzenie fasetowego wykresu korelacji przy użyciu 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") 

Co chcę zrobić jest stworzenie aspektach ggplot, który wygląda mniej więcej tak:

enter image description here

Stąd każdy aspekt powyżej wykres korelacji z następujących czynności:

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

Ale utknąłem z następującym kodem:

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) 

Co jest właściwym sposobem na zrobienie tego?

+0

Co typu mają zrobić ze swoim działce żądanego obrazu? Istnieje pakiet ggAlly z funkcją ggpairs, która może być przydatna. W tej chwili staram się zobaczyć związek między danymi przykładowymi a pożądanym działaniem. – mnel

+2

Szczególnie mylące jest odwoływanie się do mpg i wt, których nie ma w Państwa danych. – alexwhan

+0

Niestety. Poprawiłem to. Dziękuję za wskazanie. – neversaint

Odpowiedz

8

Niektóre z twoich kodów były nieprawidłowe. Działa to dla mnie:

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

Edit: następujący komentarz i edytować OP. Chodzi o to, aby odtworzyć dane wszystkimi czterema kombinacjami, a następnie aspektem.

# 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

Niezupełnie. Powinien utworzyć siatkę 2x2. Zobacz * niebieską * czcionkę na rysunku dla kombinacji. – neversaint

+3

Więc czego chcesz na przekątnej? Gdzie jest napisane "nie trzeba sporządzać wykresu" - ale jest to wykreślone na diagramie? – alexwhan

+0

Umieściłem to na schemacie, aby pokazać w każdej siatce, która kombinacja wartości jest używana do korelacji. – neversaint

3

Ponieważ dane te nie są w odpowiednim formacie, niektóre przekształcanie jest konieczne, zanim będzie mogła zostać wykreślone.

Po pierwsze, przekształcić dane w długim formacie:

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

podzielenie wartości wzdłuż type i val1 Vs. val2:

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

utworzyć listę wszystkich kombinacjach:

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

Utwórz nowy zestaw danych:

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

działki:

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

Powiązane problemy