Переупорядочение панелей переменных в нескольких точках рассеяния на основе коэффициента корреляции / линия lm (с использованием ggplot в r) - PullRequest
0 голосов
/ 06 ноября 2018

Я пытаюсь создать диаграмму рассеяния с несколькими панелями для каждой переменной. Я хотел бы изменить порядок панелей на основе их линии или коэффициентов корреляции (например, с отрицательного на положительное).

Итак, в этом примере ниже я бы хотел, чтобы в первой строке были включены графики am, drat, vs, а в последнем графике - wt

library(tidyr)
library(ggplot2)

corr_eqn = function(x, y, digits = 2) {
  corr_coef = round(cor(x, y), digits = digits)
  paste("italix(r) == ", corr_coef)
}

mtcars_gath <- mtcars %>%
  gather(-mpg, key = "var", value = "value") 

labels = data.frame(x = 300, y = 10, label = corr_eqn(mtcars_gath$value, mtcars_gath$mpg))

mtcars_plot = mtcars %>%
  gather(-mpg, key = "var", value = "value") %>%
  ggplot(aes(x = value, y = mpg)) +
  geom_point() +
  facet_wrap(~ var) +
  theme_bw()+
  geom_smooth(method = "lm", se = FALSE, color = "black", fullrange = TRUE)+
  geom_text(data = labels, aes(x = x, y = y, label = label), parse = TRUE)
mtcars_plot 

Кроме того, я не смог включить коэффициенты корреляции для каждого из графиков (как видно в этом примере).

Любой намек высоко ценится:)

Ответы [ 2 ]

0 голосов
/ 06 ноября 2018

После ответа @Chris, если вы хотите добавить метки, вам нужно использовать тот же трюк с factor:

mtcast_gat <- mtcars %>%
  gather(-mpg, key = "var", value = "value")

#Corr function:
    corr_eqn = function(x, y, digits = 2) {
      corr_coef = round(cor(x, y), digits = digits)
      paste("italic(r) == ", corr_coef)
    }

labels <- mtcast_gat %>% 
  group_by(var) %>% # group by variable
  summarise(label = corr_eqn(value, mpg), # get the formatted corr
            cor = round(cor(value, mpg), 2)) %>% # get the numeric corr
  mutate(x = 300, y = -2000) # we add labels x,y


level <- arrange(labels,desc(cor))$var # level arrangement

labels <- labels %>% 
  mutate(var = factor(var, levels=levs)) # arrangement for labels

Тогда мы можем построить:

mtcars %>%
  gather(-mpg, key = "var", value = "value") %>%
  mutate(var = factor(var, levels=levs)) %>% # correct arrangement
  arrange(var) %>% 
  ggplot(aes(x = value, y = mpg)) +
  geom_point() +
  facet_wrap(~ var) +
  geom_smooth(method = "lm", se = FALSE, color = "black", fullrange = TRUE) +
  geom_text(data = labels, aes(x = x, y = y, label = label), parse = TRUE) + # add labels
  theme_bw()

enter image description here

0 голосов
/ 06 ноября 2018

Чтобы изменить порядок панелей, вам нужно изменить уровни факторов для вашей фацетной переменной var.

Сначала получите уникальные var значения в том порядке, в котором вы хотите их отобразить:

library(tidyverse)

mtcars_gath <- mtcars %>%
  gather(-mpg, key = "var", value = "value") 

# calculate the correlation coefficients between each var and mpg
cor_df <- data.frame(var = unique(mtcars_gath$var),
                cor = sapply(unique(mtcars_gath$var), function(x) cor.test(mtcars[,x],mtcars$mpg)$estimate)
                ) 
# get your vector of var in the order you want for plotting
levs <- arrange(cor_df,desc(cor))$var

Обновите столбец var до коэффициента с уровнями в правильном порядке, и они будут использоваться в качестве порядка для построения панелей.

mtcars_plot <- mtcars_gath %>%
  mutate(var = factor(var, levels=levs)) %>%
  ggplot(aes(x = value, y = mpg)) +
  geom_point() +
  facet_wrap(~ var) +
  theme_bw()+
  geom_smooth(method = "lm", se = FALSE, color = "black", fullrange = F)

mtcars_plot

enter image description here

...