r - 如何用 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")
解决方案
这里有两个问题:
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")
将解决您的问题。
推荐阅读
- django - 如何从 ImageField 中删除不需要的东西 - Django
- javascript - 带有分数的 Vue.JS 测验 - 2 个回答者有效,3 个无效
- angular - 如何在带有打字稿的 Observable 中调用带有计时器的 Observable?
- php - 我在 yii 1.1 中做项目,在 $_post['submit']; 我得到所有数据但图像数据没有得到所以我必须做什么?
- c - 如何用整数计算浮点数的标准化方法?
- liquibase - 有没有办法在现有数据库上为每个表生成更改日志?
- regex - 拆分具有不应拆分的未转义逗号的逗号分隔字符串
- javascript - Vue.js - 如何正确有条件地设置点击处理程序代码
- javascript - 使用 MYSQL 存储 lat 和 lng 以进行距离搜索的最有效方式
- identityserver4 - 使用 Identity Server 4、VueJS 和 oidc-client 检查会话失败后自动注销