如何在 R 中为 ggplot 的每个方面添加 R2?

Posted

技术标签:

【中文标题】如何在 R 中为 ggplot 的每个方面添加 R2?【英文标题】:How to add R2 for each facet of ggplot in R? 【发布时间】:2020-05-25 08:06:13 【问题描述】:

有没有办法首先将构面标签从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()

这是我使用上述代码得到的图。 我尝试了下面的代码来更改 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。有没有什么高效的计算方式和R2facets

【问题讨论】:

要将 SUB 级别更改为“好”、“坏”和“丑”,您可以使用 fct_recode()case_when(),例如:DF %>% mutate(SUB = fct_recode(as.character(SUB), good = "1", bad = "2", ugly = "3"))"DF %>% mutate(SUB = case_when(SUB == 1 ~ "good", SUB == 2 ~ "bad", SUB == 3 ~ "ugly")) 要获得 R2,您可能需要在您想要 R2 的数据子集上迭代线性模型。最直接和最轻松的方法是使用嵌套数据框(请参阅:r4ds.had.co.nz/many-models.html)。尝试阅读链接并为自己找到一种方法 - 学习如何正确地迭代我的工作流程对我来说是一项非常宝贵的技能。如果您遇到困难,请在此处发表评论或创建新帖子。 【参考方案1】:

如果您不想使用其他包中的函数而只​​想使用ggplot2,则需要为每个SUBVariable 组合计算R2,然后添加到您的绘图中与geom_textgeom_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()

【讨论】:

【参考方案2】:

您可以使用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")

【讨论】:

图上有'R^2'和'p-value'吗? 使用stat_cor(aes(label = paste(..rr.label.., ..p.label.., sep = "~")), color = "red", geom = "label") 哇,这简直太棒了。深夜,处于紧缩模式,没有打嗝。好得令人难以置信!

以上是关于如何在 R 中为 ggplot 的每个方面添加 R2?的主要内容,如果未能解决你的问题,请参考以下文章

在 R 中为这两个直方图添加图例

在R中为三种不同的后验分布添加带有ggplot的标签[重复]

如何在 r 中为 ggplot 自定义调色板?

我们可以在R(ggplot2)中为(虚线)线添加阴影吗?

使用 ggplot2 在 r 中为热图准备数据框

在将与 map() 一起使用的函数中为 ggplot 对象添加标题