代码之家  ›  专栏  ›  技术社区  ›  PaulHurleyuk

如何在ggplot2散点图上覆盖lm对象的线

  •  11
  • PaulHurleyuk  · 技术社区  · 16 年前

    我有一些数据,

    calvarbyruno.1<-structure(list(Nominal = c(1, 3, 6, 10, 30, 50, 150, 250), Run = structure(c(1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = c("1", "2", "3"), class = "factor"), 
        PAR = c(1.25000000000000e-05, 0.000960333333333333, 0.00205833333333334, 
        0.00423333333333333, 0.0322333333333334, 0.614433333333334, 
        1.24333333333333, 1.86333333333333), PredLin = c(-0.0119152187070942, 
        0.00375925114245899, 0.0272709559167888, 0.0586198956158952, 
        0.215364594111427, 0.372109292606959, 1.15583278508462, 1.93955627756228
        ), PredQuad = c(-0.0615895732702735, -0.0501563307416599, 
        -0.0330831368244257, -0.0104619953693943, 0.100190275883806, 
        0.20675348710041, 0.6782336426345, 1.04748729725370)), .Names = c("Nominal", 
    "Run", "PAR", "PredLin", "PredQuad"), row.names = c(NA, 8L), class = "data.frame")
    calweight <- -2
    

    为此,我创建了线性和二次LM模型

    callin.1<-lm(PAR~Nominal,data=calvarbyruno.1,weight=Nominal^calweight)
    calquad.1<-lm(PAR~Nominal+I(Nominal^2),data=calvarbyruno.1,weight=Nominal^calweight)
    

    然后我可以使用ggplot2绘制数据值

    qplot(PAR,Nominal,data=calvarbyruno.1)
    

    但无法解决如何覆盖表示两个lm对象的线条…有什么想法吗?

    2 回复  |  直到 13 年前
        1
  •  30
  •   Leosar    13 年前

    最简单的选择是使用geom_Smooth(),让ggplot2适合您的模型。

    ggplot(calvarbyruno.1, aes(y = PAR, x = Nominal, weight=Nominal^calweight)) + 
        geom_smooth(method = "lm") + 
        geom_smooth(method = "lm", formula = y ~ poly(x, 2), colour = "red") + 
        geom_point() + 
        coord_flip()
    

    Illustration using geom_smooth

    或者可以使用预测值创建新的数据集。

    newdata <- data.frame(Nominal = pretty(calvarbyruno.1$Nominal, 100))
    newdata$Linear <- predict(callin.1, newdata = newdata)
    newdata$Quadratic <- predict(calquad.1, newdata = newdata)
    require(reshape2)
    newdata <- melt(newdata, id.vars = "Nominal", variable.name = "Model")
    ggplot(calvarbyruno.1, aes(x = PAR, y = Nominal, weight=Nominal^calweight)) + 
        geom_line(data = newdata, aes(x = value, colour = Model)) + 
        geom_point()
    
        2
  •  10
  •   Community Mohan Dere    9 年前

    早些时候我问了一个相关的问题,哈德利 this good answer . 使用该日志中的预测函数,可以向数据中添加两列。每个型号一个:

    calvarbyruno.1$calQuad <- predict(calquad.1)
    calvarbyruno.1$callin <- predict(callin.1)
    

    然后,绘制点并将每个模型添加为一条线:

    ggplot() + 
    geom_point(data=calvarbyruno.1, aes(PAR, Nominal), colour="green") + 
    geom_line(data=calvarbyruno.1, aes(calQuad, Nominal), colour="red" ) + 
    geom_line(data=calvarbyruno.1, aes(callin, Nominal), colour="blue" ) + 
    opts(aspect.ratio = 1)
    

    这就产生了这张漂亮的图片(是的,颜色可能需要一些工作):

    alt text http://www.cerebralmastication.com/wp-content/uploads/2009/09/ggplot2.png