2017-01-30 1 views
1

Ich mache eine einfache Handlung mit ggplot2 und ich möchte eine geglättete Linie hinzufügen, die am ersten Punkt verankert (fixiert) ist. Ich habe den beschriebenen Trick here verwendet, aber es sieht so aus, als müsste ich die angepassten Werte neu anpassen, indem ich den Unterschied y[1] - predict(lm, data.frame(y=5)) hinzufüge. Wie mache ich das? Gibt es einen besseren Weg?Ankerpunkt mit ggplot geom_smooth

library(ggplot2) 
set.seed(3) 

d = data.frame(x=5:14) 
d$y = log(d$x^2) + rnorm(10,0,2) 

ggplot(d, aes(x, y)) + 
    geom_point() + 
    geom_smooth(method='lm', formula = y ~ poly(x,4), se=F) + 
    geom_smooth(method='lm', formula = I(y-y[1]) ~ 0 + poly(x-x[1],4), se=F, color='red') 

Result

+1

das Modell Fit außerhalb von ggplot, dann die Vorhersagen bekommen und die Offset-Vorhersagen in einem Datenrahmen und Verwendung geom_line, um dies zum Grundstück hinzuzufügen –

Antwort

2

dies versuchen, sollte es funktionieren:

m <- lm(I(y-y[1]) ~ 0 + poly(x-x[1],4), data=d) # model without intercept 

ggplot(d, aes(x, y)) + 
    geom_point() + 
    geom_smooth(method='lm', formula = y ~ poly(x,4), se=F) + 
    geom_line(data=data.frame(x=d$x, 
    # the intercept is y[1] - poly(x)[1,]*coeff (it's not computed by lm) 
    # y = prediction by the model + the intercept 
    y = poly(d$x,4)%*%m$coefficients + d$y[1]-as.numeric(poly(d$x,4)[1,]%*%m$coefficients)), 
    aes(x,y), color='red') 

enter image description here

+1

Danke. Um die rote Linie glatter zu machen, nehme ich an, ich sollte einfach die Auflösung von 'x' erhöhen. – sirallen

+0

Ja, es sollte funktionieren. –

Verwandte Themen