将三阶多项式及其方程添加到GGR图中

将三阶多项式及其方程添加到GGR图中,r,ggplot2,R,Ggplot2,我绘制了以下数据并添加了黄土平滑器。我想在绘图中添加一个三阶多项式及其方程(包括残差)。有什么建议吗 set.seed(1410) dsmall<-diamonds[sample(nrow(diamonds), 100), ] df<-data.frame("x"=dsmall$carat, "y"=dsmall$price) p <-ggplot(df, aes(x, y)) p <- p + geom_point(alpha=2/10, shape=21, fil

我绘制了以下数据并添加了黄土平滑器。我想在绘图中添加一个三阶多项式及其方程(包括残差)。有什么建议吗

set.seed(1410)
dsmall<-diamonds[sample(nrow(diamonds), 100), ]
df<-data.frame("x"=dsmall$carat, "y"=dsmall$price)

p <-ggplot(df, aes(x, y)) 
p <- p + geom_point(alpha=2/10, shape=21, fill="blue", colour="black", size=5)

#Add a loess smoother
p<- p + geom_smooth(method="loess",se=TRUE)
set.seed(1410)

dsmall第1部分:要拟合多项式,请使用以下参数:

  • method=lm
    -您这样做是正确的
  • formula=y~poly(x,3,raw=TRUE)
    -也就是说,不要在调用
    lm
守则:

p + stat_smooth(method="lm", se=TRUE, fill=NA,
                formula=y ~ poly(x, 3, raw=TRUE),colour="red")
lm_eqn = function(df){
  m=lm(y ~ poly(x, 3), df)#3rd degree polynomial
  eq <- substitute(italic(y) == a + b %.% italic(x)*","~~italic(r)^2~"="~r2,
                   list(a = format(coef(m)[1], digits = 2),
                        b = format(coef(m)[2], digits = 2),
                        r2 = format(summary(m)$r.squared, digits = 3)))
  as.character(as.expression(eq))
}


p + annotate("text", x=0.5, y=15000, label=lm_eqn(df), hjust=0, size=8, 
             family="Times", face="italic", parse=TRUE)


第2部分:添加方程式:

  • 修改函数
    lm_eqn()
    以正确地将数据源指定为
    lm
    -右括号放错了位置
  • 使用
    annotate()
    定位标签,而不是
    geom_text
守则:

p + stat_smooth(method="lm", se=TRUE, fill=NA,
                formula=y ~ poly(x, 3, raw=TRUE),colour="red")
lm_eqn = function(df){
  m=lm(y ~ poly(x, 3), df)#3rd degree polynomial
  eq <- substitute(italic(y) == a + b %.% italic(x)*","~~italic(r)^2~"="~r2,
                   list(a = format(coef(m)[1], digits = 2),
                        b = format(coef(m)[2], digits = 2),
                        r2 = format(summary(m)$r.squared, digits = 3)))
  as.character(as.expression(eq))
}


p + annotate("text", x=0.5, y=15000, label=lm_eqn(df), hjust=0, size=8, 
             family="Times", face="italic", parse=TRUE)
lm_eqn=函数(df){
m=lm(y~多边形(x,3),df)#三次多项式

eq答案1是一个很好的开始,但它不适用于要求的三次多项式,并且不能正确处理参数估计的负值。最简单的方法是使用package
polynom
。我将展示一个没有定义函数的版本,因为在这种情况下确实应该使用ggplot
stat

下面,我将展示如何生成文本以用作任意阶多项式的解析标签。我使用
signif()
而不是
format()
,因为这对参数估计更有用。还请注意,不再需要
face
。使用
family=“Times”
是不可移植的,同样的效果可以通过
“serif”
来实现。所有的艰苦工作都是通过
as.character.polymone()来完成的。

库(polynom)
图书馆(GG2)
种子集(1410)

dsmall我发现有一个。然而,我的答案中的方法是不同的。
lm_eqn
函数用于线性回归,而不是三次多项式有一件事让我大吃一惊-
公式需要引用
y
x
,而不是data.frame中的变量名在OP的示例中,e名称恰好是
x
y
library(polynom)
library(ggplot2)

set.seed(1410)
dsmall <- diamonds[sample(nrow(diamonds), 100), ]
df <- data.frame("x"=dsmall$carat, "y"=dsmall$price)

my.formula <- y ~ poly(x, 3, raw = TRUE)
p <- ggplot(df, aes(x, y)) 
p <- p + geom_point(alpha=2/10, shape=21, fill="blue", colour="black", size=5)
p <- p + geom_smooth(method = "lm", se = FALSE, 
                     formula = my.formula, 
                     colour = "red")

m <- lm(my.formula, df)
my.eq <- as.character(signif(as.polynomial(coef(m)), 3))
label.text <- paste(gsub("x", "~italic(x)", my.eq, fixed = TRUE),
              paste("italic(R)^2",  
                    format(summary(m)$r.squared, digits = 2), 
                    sep = "~`=`~"),
                    sep = "~~~~")

p + annotate(geom = "text", x = 0.2, y = 15000, label = label.text, 
             family = "serif", hjust = 0, parse = TRUE, size = 4)