如何在 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
。有没有什么高效的计算方式和R2
到facets
?
【问题讨论】:
要将 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
,则需要为每个SUB
和Variable
组合计算R2
,然后添加到您的绘图中与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()
【讨论】:
【参考方案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?的主要内容,如果未能解决你的问题,请参考以下文章