How to create a faceted correlation graph using GGPLOT

I have a data frame created as follows.

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

What I want to do is create a faceted ggplot that looks something like this:

enter image description here

Therefore, each face above is a correlation graph:

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

But I am stuck in the following code:

 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) 

What is the right way to do this?

+5
source share
3 answers

Some of your code was incorrect. This works for me:

 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: After commenting and editing. The idea is to recreate data with all four combinations, and then with the facet.

 # 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

+8
source

Since your data is not in the appropriate format, before it can be plotted, some restructuring is necessary.

First, change the data in a long format:

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

Separate the values ​​along type and val1 against val2 :

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

Create a list of all combinations:

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

Create a new dataset:

 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

+3
source

ggpubr is available an additional package ggpubr designed specifically to solve this problem using the stat_cor() function.

 library(tidyverse) library(ggpubr) ggplot(all, aes(val1, val2))+ geom_smooth(method = "lm") + geom_point() + facet_grid(~type) + stat_cor() 

enter image description here

0
source

Source: https://habr.com/ru/post/952535/


All Articles