Как добавить R2 для каждого аспекта ggplot в R? - PullRequest
1 голос
/ 10 февраля 2020

Есть ли способ сначала изменить метку фасета с 1:3 на что-то вроде c(good, bad, ugly). Кроме того, я хотел бы добавить значение R2 для каждого аспекта. Ниже приведен мой код - я попробовал несколько вещей, но безуспешно.

DF = data.frame(SUB = rep(1:3, each = 100), Ob = runif(300, 50,100), S1 = runif(300, 75,95), S2 = runif(300, 40,90),
                S3 = runif(300, 35,80),S4 = runif(300, 55,100))
FakeData = gather(DF, key = "Variable", value = "Value", -c(SUB,Ob))

ggplot(FakeData, aes(x = Ob, y = Value))+
  geom_point()+ geom_smooth(method="lm") + facet_grid(Variable ~ SUB,  scales = "free_y")+
  theme_bw()

Вот рисунок, который я получаю, используя приведенный выше код. enter image description here Я попытался из приведенного ниже кода изменить facet_label, но он не сработал

ggplot(FakeData, SUB = factor(SUB, levels = c("Good", "Bad","Ugly")), aes(x = Ob, y = Value))+
  geom_point()+ geom_smooth(method="lm") + facet_grid(Variable ~ SUB,  scales = "free_y")+
  theme_bw()

Я не представляю, как добавить R2 к facets. Есть ли эффективный способ вычисления и R2 до facets?

Ответы [ 2 ]

3 голосов
/ 10 февраля 2020

Вы можете использовать ggpubr::stat_cor(), чтобы легко добавить коэффициенты корреляции к вашему графику.

library(dplyr)
library(ggplot2)
library(ggpubr)

FakeData %>%
  mutate(SUB = factor(SUB, labels = c("good", "bad", "ugly"))) %>%
  ggplot(aes(x = Ob, y = Value)) +
  geom_point() +
  geom_smooth(method = "lm") +
  facet_grid(Variable ~ SUB,  scales = "free_y") +
  theme_bw() +
  stat_cor(aes(label = ..rr.label..), color = "red", geom = "label")

enter image description here

2 голосов
/ 10 февраля 2020

Если вы не хотите использовать функции из других пакетов и хотите использовать только ggplot2, вам необходимо вычислить R2 для каждой комбинации SUB и Variable, а затем добавить к своему графику с geom_text или geom_label. Вот один из способов сделать это.

library(tidyverse)

set.seed(1)

DF = data.frame(SUB = rep(1:3, each = 100), Ob = runif(300, 50,100), S1 = runif(300, 75,95), S2 = runif(300, 40,90),
                S3 = runif(300, 35,80),S4 = runif(300, 55,100))
FakeData = gather(DF, key = "Variable", value = "Value", -c(SUB,Ob))

FakeData_lm <- FakeData %>%
  group_by(SUB, Variable) %>%
  nest() %>%
  # Fit linear model
  mutate(Mod = map(data, ~lm(Value ~ Ob, data = .x))) %>%
  # Get the R2
  mutate(R2 = map_dbl(Mod, ~round(summary(.x)$r.squared, 3))) 

ggplot(FakeData, aes(x = Ob, y = Value))+
  geom_point()+ 
  geom_smooth(method="lm") + 
  # Add label
  geom_label(data = FakeData_lm, 
             aes(x = Inf, y = Inf, 
                 label = paste("R2 = ", R2, sep = " ")),
             hjust = 1, vjust = 1) +
  facet_grid(Variable ~ SUB,  scales = "free_y") +
  theme_bw()

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...