您可以非常轻松地在ggplot2中扩展回归线:
c <- ggplot(mtcars, aes(y=wt, x=mpg)) + xlim(0,50)
c + stat_smooth(method=lm, fullrange=TRUE) + geom_point()
我的问题是,是否可以只向一个方向延伸?
在你提出要求之前,我有充分的理由这样做,我保证!
答案 0 :(得分:10)
在stat_smooth
的内部工作中,调用predictdf
来创建平滑线。这里的困难是:这是一个未导出的S3方法。它也没有采取...参数,因此很难扩展它。
这里的想法是创建一个新的虚拟类lm_right
和lm_left
,我们称之为默认的lm
方法。
## decorate lm object with a new class lm_right
lm_right <- function(formula,data,...){
mod <- lm(formula,data)
class(mod) <- c('lm_right',class(mod))
mod
}
## decorate lm object with a new class lm_left
lm_left <- function(formula,data,...){
mod <- lm(formula,data)
class(mod) <- c('lm_left',class(mod))
mod
}
然后,对于每个方法,我们创建一个predict_df
特化,我们在另一侧截断x值。
predictdf.lm_right <-
function(model, xseq, se, level){
## here the main code: truncate to x values at the right
init_range = range(model$model$x)
xseq <- xseq[xseq >=init_range[1]]
ggplot2:::predictdf.default(model, xseq[-length(xseq)], se, level)
}
左侧扩展名同样如此:
predictdf.lm_left <-
function(model, xseq, se, level){
init_range = range(model$model$x)
## here the main code: truncate to x values at the left
xseq <- xseq[xseq <=init_range[2]]
ggplot2:::predictdf.default(model, xseq[-length(xseq)], se, level)
}
最后一个使用示例:
library(ggplot2)
library(gridExtra)
## you should set the fullrange option to a true
p1 <- ggplot(mtcars, aes(y=wt, x=mpg)) + xlim(0,50) + geom_point() +
stat_smooth(method="lm_left", fullrange=TRUE,col='green')
p2 <- ggplot(mtcars, aes(y=wt, x=mpg)) + xlim(0,50) + geom_point() +
stat_smooth(method="lm_right", fullrange=TRUE,col='red')
grid.arrange(p1,p2)