Reputation: 23650
I cannot seem to replicate the adding of a linear abline to a log-log ggplot. Code below illustrates. Grateful for an idea where I'm going wrong.
d = data.frame(x = 100*sort(rlnorm(100)), y = 100*sort(rlnorm(100)))
(fit = lm(d$y ~ d$x))
# linear plot to check fit
ggplot(d, aes(x, y)) + geom_point() + geom_abline(intercept = coef(fit)[1], slope = coef(fit)[2], col='red')
# log-log base plot to replicate in ggplot (don't worry if fit line looks a bit off)
plot(d$x, d$y, log='xy')
abline(fit, col='red', untf=TRUE)
# log-log ggplot
ggplot(d, aes(x, y)) + geom_point() +
geom_abline(intercept = coef(fit)[1], slope = coef(fit)[2], col='red') +
scale_y_log10() + scale_x_log10()
Upvotes: 8
Views: 9645
Reputation: 846
If you run the regression in logs, fit the line, and the transform the scales, you can use geom_abline
d = data.frame(x = 100*sort(rlnorm(100)), y = 100*sort(rlnorm(100)))
(fit = lm(log(d$y) ~ log(d$x)))
p <- ggplot(d, aes(x, y)) + geom_point() +
geom_abline(intercept = coef(fit)[1], slope = coef(fit)[2], col='red') +
scale_y_continuous(trans=log_trans()) +
scale_x_continuous(trans=log_trans())
Upvotes: 6
Reputation: 98449
As you are plotting linear relationship between x and y, you can use geom_smooth()
with method="lm"
.
ggplot(d, aes(x, y)) + geom_point() + geom_smooth(method="lm",se=FALSE)+
scale_y_log10() + scale_x_log10()
It seems that geom_abline()
doesn't have argument untf=TRUE
as for function abline()
.
Workaround would be to use geom_line()
and new data frame in it that contains y values calculated using coefficients of your linear model or using function predict()
.
ggplot(d, aes(x, y)) + geom_point() +
geom_line(data=data.frame(x=d$x,y=coef(fit)[1]+coef(fit)[2]*d$x))+
scale_y_log10() + scale_x_log10()
ggplot(d, aes(x, y)) + geom_point() +
geom_line(data=data.frame(x=d$x,y=predict(fit)))+
scale_y_log10() + scale_x_log10()
Upvotes: 11