For scatter plot’s I usually like to add a identity line.
Code
library(ggplot2)
plot <-
ggplot(mtcars,aes(qsec,mpg))+
geom_point()
plot+
#Identity line
geom_abline(aes(slope = 1, intercept = 0,alpha = "Identity line"), linetype = "dashed", col = "red")+
labs(alpha = "")+
scale_alpha_manual(values = c(1,1))
Output
That works! But since I do this frequently I was thinking about adding as a funtion to my library. I already have some functions there that work with ggplot2
.
Tentative 1
First I tried to create a function, just like the others I already have:
plt_identity_line <- function(){
geom_abline(aes(slope = 1, intercept = 0,alpha = "Identity line"), linetype = "dashed")+
labs(alpha = "")+
scale_alpha_manual(values = c(1,1))
}
Then, applying to my ggplot object:
plot + plt_identity_line()
I got the following error:
Error in
plt_identity_line()
: ! Cannot add ggproto objects together.
Did you forget to add this object to a ggplot object?
I understand that in this case since I am using multiple layers of ggplot and a geometry, the function did not work, since there is no ggplot()
.
Tentative 2
Considering the error I got before, I succeded with a function like this:
plt_identity_line <- function(ggplot){
ggplot+
geom_abline(aes(slope = 1, intercept = 0,alpha = "Identity line"), linetype = "dashed", col = "red")+
labs(alpha = "")+
scale_alpha_manual(values = c(1,1))
}
plt_identity_line(plot)
It works! But ideally what I want is a function what I can add to my plot with the operator +
.
>Solution :
Put the layers in a list:
plt_identity_line <- function(){
list(
geom_abline(aes(slope = 1, intercept = 0, alpha = "Identity line"),
linetype = "dashed", color = "red"),
labs(alpha = ""),
scale_alpha_manual(values = c(1,1))
)
}
plot + plt_identity_line()