首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在ggplot中标记R2和p值?

在ggplot中标记R2和p值?
EN

Stack Overflow用户
提问于 2020-03-01 13:10:19
回答 2查看 149关注 0票数 0

我正在尝试将两个并行建模结果的lm模型coef添加到相同的ggplot上。下面是我的工作示例:

代码语言:javascript
复制
library(ggplot2)

set.seed(100)
dat <- data.frame(
        x <- rnorm(100, 1),
        y <- rnorm(100, 10),
        lev <- gl(n = 2, k = 50, labels = letters[1:2])
        )

mod1 <- lm(y~x, dat = dat[lev %in% "a", ])
r1 <- paste("R^2==", round(summary(mod1)[[9]], 3))
p1<- paste("p==", round(summary(mod1)[[4]][2, 4], 3), sep= "")
lab1 <- paste(r1, p1, sep =",")

mod2 <- lm(y~x, dat = dat[lev %in% "b", ])
r2 <- paste("R^2==", round(summary(mod2)[[9]], 3))
p2 <- paste("p==", round(summary(mod2)[[4]][2, 4], 3), sep= "")
lab2 <- paste(r2, p2, sep =",")

ggplot(dat, aes(x = x, y = y, col = lev)) + geom_jitter() + geom_smooth(method = "lm") + annotate("text", x = 2, y = 12, label = lab1, parse = T) + annotate("text", x = 10, y = 8, label = lab2, parse = T)

以下是推广秀:

代码语言:javascript
复制
Error in parse(text = text[[i]]) : <text>:1:12: unexpected ','
1: R^2== 0.008,

现在的问题是,我可以单独标记R2或p值,但不能将它们放在一起。如何将两个结果放入图中的一条线中?顺便说一句,有没有其他有效的方法来做和我的代码一样的事情呢?我有九个子图,我想放在一个完整的图中,我不想一个接一个地添加它们。

++++++++++++++++++++++++++一些更新++++++++++++++++++++++++++++++++++遵循@G. Grothendieck的建议和想法,我试图将代码中最重复的部分封装到一个函数中,这样我就可以用几行代码完成所有的绘图。现在的问题是,无论我改变输入变量,输出的绘图基本上都是相同的,除了轴标签。有人能解释为什么吗?下面是我使用的工作代码:

代码语言:javascript
复制
library(ggplot2)
library(ggpubr)

set.seed(100)
dat <- data.frame(
        x = rnorm(100, 1),
        y = rnorm(100, 10),
        z = rnorm(100, 25),
        lev = gl(n = 2, k = 50, labels = letters[1:2])
        )
test <- function(dat, x, y){
fmt <- "%s: Adj ~ R^2 == %.3f * ',' ~ {p == %.3f}"

mod1 <- lm(y ~ x, dat, subset = lev == "a")
sum1 <- summary(mod1)
lab1 <- sprintf(fmt, "a", sum1$adj.r.squared, coef(sum1)[2, 4])

mod2 <- lm(y ~ x, dat, subset = lev == "b")
sum2 <- summary(mod2)
lab2 <- sprintf(fmt, "b", sum2$adj.r.squared, coef(sum2)[2, 4])

colors <- 1:2

p <- ggplot(dat, aes(x = x, y = y, col = lev)) + 
  geom_jitter() +
  geom_smooth(method = "lm") + 
  annotate("text", x = 2, y = c(12, 8), label = c(lab1, lab2), 
    parse = TRUE, hjust = 0, color = colors) +
  scale_color_manual(values = colors)
return(p)
} 

ggarrange(test(dat, x, z), test(dat, y, z))
EN

回答 2

Stack Overflow用户

发布于 2020-03-01 19:50:14

这里有几个问题:

  • xylevdata.frame的参数,因此必须使用=而不是subset=来指定它们在lm
  • use sprintf中使用subset=参数而不是paste来简化标签的规范,并标记文本字符串ab,并使它们与相应的行具有相同的颜色,以标识需要更正公式语法的

<代码>H121。请参阅下面的代码。使用组件名称和摘要对象的访问器函数available

  • use TRUE会比使用T更清楚,因为如果存在名为T的变量,但TRUE永远不能为TRUE,则可以覆盖后者,并调整D36中的x=和D35,以便将D39中的两个文本对齐,将ggplot语句的各个术语对齐在单独的行上,以提高可读性

这提供了:

代码语言:javascript
复制
library(ggplot2)

set.seed(100)
dat <- data.frame(
        x = rnorm(100, 1),
        y = rnorm(100, 10),
        lev = gl(n = 2, k = 50, labels = letters[1:2])
        )

fmt <- "%s: Adj ~ R^2 == %.3f * ',' ~ {p == %.3f}"

mod1 <- lm(y ~ x, dat, subset = lev == "a")
sum1 <- summary(mod1)
lab1 <- sprintf(fmt, "a", sum1$adj.r.squared, coef(sum1)[2, 4])

mod2 <- lm(y ~ x, dat, subset = lev == "b")
sum2 <- summary(mod2)
lab2 <- sprintf(fmt, "b", sum2$adj.r.squared, coef(sum2)[2, 4])

colors <- 1:2

ggplot(dat, aes(x = x, y = y, col = lev)) + 
  geom_jitter() +
  geom_smooth(method = "lm") + 
  annotate("text", x = 2, y = c(12, 8), label = c(lab1, lab2), 
    parse = TRUE, hjust = 0, color = colors) +
  scale_color_manual(values = colors)

票数 2
EN

Stack Overflow用户

发布于 2020-03-01 14:13:48

除非我误解了您的问题,否则问题出在annotate调用的parse = T参数上。我不认为你的字符串需要被解析。尝试使用parse = F,或者直接删除该参数,因为默认值似乎无论如何都是FALSE

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60472186

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档