我正在尝试将两个并行建模结果的lm模型coef添加到相同的ggplot上。下面是我的工作示例:
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)以下是推广秀:
Error in parse(text = text[[i]]) : <text>:1:12: unexpected ','
1: R^2== 0.008,现在的问题是,我可以单独标记R2或p值,但不能将它们放在一起。如何将两个结果放入图中的一条线中?顺便说一句,有没有其他有效的方法来做和我的代码一样的事情呢?我有九个子图,我想放在一个完整的图中,我不想一个接一个地添加它们。
++++++++++++++++++++++++++一些更新++++++++++++++++++++++++++++++++++遵循@G. Grothendieck的建议和想法,我试图将代码中最重复的部分封装到一个函数中,这样我就可以用几行代码完成所有的绘图。现在的问题是,无论我改变输入变量,输出的绘图基本上都是相同的,除了轴标签。有人能解释为什么吗?下面是我使用的工作代码:
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))发布于 2020-03-01 19:50:14
这里有几个问题:
x,y和lev是data.frame的参数,因此必须使用=而不是subset=来指定它们在lmsprintf中使用subset=参数而不是paste来简化标签的规范,并标记文本字符串a和b,并使它们与相应的行具有相同的颜色,以标识需要更正公式语法的<代码>H121。请参阅下面的代码。使用组件名称和摘要对象的访问器函数available
TRUE会比使用T更清楚,因为如果存在名为T的变量,但TRUE永远不能为TRUE,则可以覆盖后者,并调整D36中的x=和D35,以便将D39中的两个文本对齐,将ggplot语句的各个术语对齐在单独的行上,以提高可读性这提供了:
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)

发布于 2020-03-01 14:13:48
除非我误解了您的问题,否则问题出在annotate调用的parse = T参数上。我不认为你的字符串需要被解析。尝试使用parse = F,或者直接删除该参数,因为默认值似乎无论如何都是FALSE
https://stackoverflow.com/questions/60472186
复制相似问题