首页 > 解决方案 > 如何用 lm 模型结果的 p 值绘制 geom_smooth 线?

问题描述

我试图在 ggplot 中像这样绘制我的日期:在此处输入图像描述,线型由平滑线的 p 值确定(即,如果回归不显着,则为虚线,如果回归不显着,则为实线)。在我发布这个问题之前,我在这个论坛上尝试了这个答案,但他们通常处理标签,而不是线路本身。Belwo 是带有示例数据的失败代码。提前感谢您的帮助。

library(plyr)
library(ggplot2)
dat <- data.frame(id = 1: 100, 
                   x = rnorm(100,2,0.5), 
                   y = rnorm(100, 20, 5),
                  varA = rep(letters[1:4], 25), 
                  varB = factor(sample(c(50,100,150), 100, TRUE)))

pvdat <- ddply(dat,.(varA,varB), function(df) data.frame(pvalue=format(signif(summary(lm(y~x,data=df))[[4]][2, 4], 2),scientific=-2),
                                                          lty = ifelse(summary(lm(y~x,data=df))[[4]][2, 4] > 0.05, 0, 1)))
ggplot(data= dat, aes(x = x, y = y, col = as.factor(varB))) + geom_smooth(method = "lm", aes(linetype = pvdat$lty)) + facet_grid(. ~ as.factor(varA), scale = "free_x")                                                       

标签: rggplot2

解决方案


这里有两个问题:

  • pvdata$lty是连续的,但linetype需要一个因子
  • pvdata 有 10 项但 dat 有 100 项,所以 ggplot 不知道如何在两者之间进行映射

要将您的数值列更改为一个因子,您需要as.factor(),并且要进行映射,您可以使用该merge()函数创建一个数据框,其中 pvdat 中的值映射到 dat 的每个元素。把这些放在一起:

ggplot(data= merge(dat,pvdat,by = c("varA","varB")), aes(x = x, y = y, col = as.factor(varB))) + geom_smooth(method = "lm", aes(linetype = as.factor(lty))) + facet_grid(. ~ as.factor(varA), scale = "free_x")

将解决您的问题。


推荐阅读