在进行回归分析之前,通常要画散点图看两组的相关趋势,并添加拟合曲线,本文就描述一下,如何使用ggplot2来绘制散点图,并添加拟合曲线及其95%CI,最后加上R方值和回归方程。
本文使用iris数据集进行演示(多变量数据,包含不同的因子),首先我想通过构建一个函数,可以生成一个数据框,包括R平方,截距和系数(方便ggplot2作图),这样就可以将多个变量两两之间的回归方程展示在一个图中。
构建函数:
#函数作用:输入一个数据框,输入两列的列名以及因子列的列名,求不同因子(分组)之间的回归系数
例如iris数据集:
这里我输入两列的列名(例如Sepal.Length和Sepal.Width),再输入因子列,也就是最后一列,就可以分别得到三种不同的种属中Sepal.Length和Sepal.Width的相关系数。
Add_R <- function(dataframe,x,y,factor){ #四个参数,数据框,第一列和第二列的列名,因子列的列名
cor <- data.frame()
dataframe[,factor] <- as.factor(dataframe[,factor])
lev <- levels(dataframe[,factor])
for (i in c(1:length(lev))) {
name <- lev[i]
data <- dataframe[which(dataframe[,factor] == name),]
lm <- summary(lm(data,formula = data[,y]~data[,x]))
r_squared <- round(lm$r.squared,2)
inter <- round(lm$coefficients[1,1],2)
coefficients <- round(lm$coefficients[1,2],2)
max_x <- max(data[,x]) #给出图中添加文本的位置
max_y <- max(data[,y])
if(inter>0){
eq <- substitute(""~R^2~"="~a~","~hat(y)~" = "~b%.%x+c~ "",list(a = r_squared,b = coefficients,c = inter)) #非常重要的一步,把公式打包,在通过下面的as.charaster来把公式以字符串的形式表示,因为geom_text这个函数中的label参数只接受字符串类型的数据
}
else{
inter <- abs(inter)
eq <- substitute(""~R^2~"="~a~","~hat(y)~" = "~b%.%x-c~"",list(a = r_squared,b = coefficients,c = inter))
}
cor <- rbind(cor,cbind(rsqua = r_squared,coef = coefficients,intercept = inter,max_x = max_x,max_y = max_y,exp = ""))
exp <- as.character(as.expression(eq))
cor$exp[i] <- exp
row.names(cor)[i] <- name
}
for (i in c(1:5)){
cor[,i] <- as.numeric(cor[,i]) #转换为数值向量
}
return(cor)
}
df <- Add_R(iris,"Sepal.Length","Sepal.Width","Species") #求这两列不同种属的相关性
df
开始绘图
library(ggplot2) #加载包
ggplot(iris,aes(Sepal.Length,Sepal.Width))+ #和上面函数输入的要对应(df这个数据框)
geom_point(size = 3,aes(color = Species,shape = Species,fill = Species))+
geom_smooth(aes(color = Species,fill = Species),method = "lm",level = 0.95,formula = y~x,linetype = 2,alpha = 0.2)+
scale_color_manual(values = c("slateblue2","blue4","tomato2"))+
geom_text(data = df,aes(max_x,max_y,label = exp),vjust = 0,nudge_y = 0.1,size = 5,parse = T,color = c("slateblue2","blue4","tomato2"),)+ #注意parse = T参数,这个一定要等于T,才能把字符串类型的公式,以公式的形式表达。
coord_cartesian(xlim = c(4,9),expand = F,ylim = c(2,4.7))+
theme(panel.background = element_blank(),
panel.grid.major.y = element_line(colour = "grey",linetype = 2),
axis.line = element_line(colour = "black",size = rel(2),arrow = arrow(angle = 30,length = unit(0.1,"inches"))),
axis.title.y = element_text(size = rel(2),hjust = 0.5),
axis.title.x = element_text(size = rel(2),hjust = 0.5),
axis.text.x = element_text(size = rel(2),hjust = 1),
axis.text.y = element_text(hjust = 1,size = rel(2)),
axis.ticks = element_line(size = rel(1.3)),
plot.title = element_text(size = rel(1.8)),
plot.margin = margin(15,9,9,30))