我从here借用了这个示例数据集:
# Load library
library(ggplot2)
# Load data
data(mtcars)
# Plot data
p <- ggplot(mtcars,aes(x = disp, y = mpg)) + geom_point() + facet_grid(gear ~ am)
p <- p + geom_smooth(method="lm")
print(p)
在上面的代码中,回归方法和公式在所有方面都是相同的。如果我们要为 facet(或panel)6 指定公式,我们会从here获得以下代码:
# Smoothing function with different behaviour depending on the panel
custom.smooth <- function(formula, data,...){
smooth.call <- match.call()
if(as.numeric(unique(data$PANEL)) == 6) {
# Linear regression
smooth.call[[1]] <- quote(lm)
# Specify formula
smooth.call$formula <- as.formula("y ~ log(x)")
}else{
# Linear regression
smooth.call[[1]] <- quote(lm)
}
# Perform fit
eval.parent(smooth.call)
}
# Plot data with custom fitting function
p <- ggplot(mtcars,aes(x = disp, y = mpg)) + geom_point() + facet_grid(gear ~ am)
p <- p + geom_smooth(method = "custom.smooth", se = FALSE)
print(p)
现在,如果我想在这些方面添加回归方程式:
# Load library
library(ggpmisc)
p + stat_poly_eq(formula = y ~ x,aes(label = paste(..eq.label.., ..rr.label.., sep = "~~~")),
parse=TRUE,label.x.npc = "right")
那么我应该怎么做,以指定面板6 上显示的等式和R2,它可以匹配我之前指定的模型?请参见下图,现在面板6有自己的拟合模型,但方程标签不是。也许我们可以像ggplot2参数那样定义一个类似的函数?
答案 0 :(得分:1)
您调用的函数custom.smooth
似乎包含一个将公式定义为"y ~ log(x)"
的行。因此,您还需要在stat_poly_eq
函数中指定它,因此是线性外观方程的多项式形状(但实际上是对数)。
即。添加:
p + stat_poly_eq(formula = y ~ log(x),
aes(label = paste(..eq.label.., ..rr.label.., sep = "~~~")),
parse=TRUE,label.x.npc = "right")
答案 1 :(得分:1)
你可以单独更新面板6的公式(当然你也可以用这样的功能更新所有面板,但这里没有必要)
rename_panel_expression <- function(grb, panel, expr) {
g <- grb$grobs[[panel + 1]]$children
grb$grobs[[panel + 1]]$children[[grep("GRID.text", names(g))]]$label <- expr
grb
}
l <- lm(mpg ~ log(disp), mtcars[mtcars$am == 1 & mtcars$gear == 5, ])
tt <- rename_panel_expression(ggplotGrob(p), 6,
bquote(italic(y)~`=`~.(round(l$coefficients[1], 3)) - .(round(abs(l$coefficients[2]), 3))*~italic(x)~~~italic(R)^2~`=`~.(round(summary(l)$r.squared, 3))))
grid::grid.newpage()
grid::grid.draw(tt)