第19天 ggplot2数据可视化(2)数据组间比较绘图方法 在医学数据进行统计分析时,经常需要借助图形来表达均数、标准误、率、构成比、P值,标签等指标,本章将对医学数据组间比较绘图方法。 在进行绘图之前,我们先导入数据,并对数据进行前处理。 elder1<-read.csv("elder1.csv") elder2<-read.csv("elder2.csv") #导入数据库 newdata<-merge(elder1,elder2, by="ID") #合并 newdata$sex<-as.factor(newdata$sex) newdata$sleep<-as.factor(newdata$sleep) #将分类变量转成因子 newdata<- na.omit(newdata) #剔除缺失数据 一、定量数据组间比较 医学数据中,最为常见的就是对两组或多组的定量、定性数据进行比较,结果的表达有均数±标准差,或者是中位数(四分位间距),这两种形式的结果可以分别用误差条图、箱式图进行表达。 1、正态分布数据比较(误差条图) 如果我们对不同性别的收缩压(SBP)进行分析,假设符合正态性和方差齐性,进行t检验后,可用误差条图表示各组间的均数,标准误,可信区间及P值。 在利用ggplot2进行之前,对数据的格式进行转化是非常重要,与其我们苦苦挣扎着在ggplot2里直接对原变量进行绘图,还不如把原变量数据进行转化生成新的变量,以适应ggplot2绘图功能。系统自带的dplyr包可以很好的帮助我们实现这一目的。 对数据格式进行转化 library(dplyr) #加载dplyr包 by_sex<-group_by(newdata,sex) #对性别进行分组 newdata1<-summarise(by_sex,n=n(),mean=mean(SBP),sd=sd(SBP)) #分别计算男女例数,均数,标准差 newdata1<-mutate(newdata1,se=sd/sqrt(n)) #对标准误进行计算 View(newdata1) 将原数据整理成绘图所需要的数据 下图就是绘制的不同性别收缩压的误差条图,有点难看,误差线太小,没办法,数据样本量大了,标准误自然就小了,看到的误差区间就很小,大家将就着看吧。 那么这个图要怎么绘制呢,我一步一步给大家讲解。 首先,我们先得加载ggplot2包,这个是必需的。 library(ggplot2) #加载ggplot2包 1)绘制不同性别血压值的条形图 ggplot(data = newdata1, aes(x = sex, y = mean,fill=sex)) + #x表示分组,y表示均数,fill表示对分组进行填充,如果不填,后面的scale_fill_ 就会运行不起来。 geom_bar(stat = "identity",width = 0.5) + #stat表示对原数据进行绘图,前期我们已经整理过了,所以不需要进行统计,width表示条形的宽度 scale_fill_manual(values = c("red","blue")) #根据自己的喜好选择颜色 2)绘制误差线 geom_errorbar(aes(ymax = mean + 1.96*se, ymin =mean - 1.96*se), width = 0.2) #ymax,ymin表示误差线的上限和下限,width表示误差线的宽度 3)绘制比较线条 geom_segment(aes(x=1, y=140, xend=1, yend=160))+ geom_segment(aes(x=2, y=140, xend=2, yend=160))+ geom_segment(aes(x=1, y=160, xend=2, yend=160)) #geom_segment 是在面版中绘制线段,比较线并不是一个图层,而是画了三线条而来的。 4)绘制P值 annotate("text", x=1.5, y=170, label="P>0.05", size=5) #P值就是作为标签画到面版上,x,y是P值所在的位置,label表示要画的标签,size表示标签的大小。 把这几步连接起来,完整的误差条图代码就是这样 ggplot(data = newdata1, aes(x = sex, y = mean,fill=sex)) + geom_bar(stat = "identity",width = 0.5) + scale_fill_manual(values = c("red","blue"))+ geom_errorbar(aes(ymax = mean + 1.96*se, ymin =mean - 1.96*se), position = position_dodge(0.9), width = 0.2)+ geom_segment(aes(x=1, y=140, xend=1, yend=160))+ geom_segment(aes(x=2, y=140, xend=2, yend=160))+ geom_segment(aes(x=1, y=160, xend=2, yend=160))+ annotate("text", x=1.5, y=170, label="P>0.05", size=5) 2、偏态分布数据比较(箱式图) 如果我还是不同性别的收缩压(SBP)进行分析,假设SBP不符合正态性,进行秩和检验,可用箱式图表示各组间的中位数,上下四分位数。 利用原始数据绘制箱式图较为简单,不需要对原始数据进行转化。 1)绘制箱式图 ggplot(newdata, aes(x=sex, y=SBP))+ #x表示对不同组进行绘图,y 表示要分析的 变量 geom_boxplot(fill="red",outlier.shape=NA) #fill表示填充的颜色,两组颜色一致,如果在ggplot函数下,则两组颜色会不一致;outlier.shape表示是否要异常值 2) 绘制比较线和P值,误差条图已介绍,这里就不进行介绍了。 箱式图:完整的代码 ggplot(newdata, aes(x=sex, y=SBP))+ geom_boxplot(fill="red",outlier.shape=NA)+ geom_segment(aes(x=1, y=200, xend=1, yend=220))+ geom_segment(aes(x=2, y=200, xend=2, yend=220))+ geom_segment(aes(x=1, y=220, xend=2, yend=220))+ annotate("text", x=1.5, y=230, label="P>0.05", size=5) 如果想要在箱式图里加上点,可以再加一个点的图层。 ggplot(newdata, aes(x=sex, y=SBP))+ geom_boxplot(fill="red",outlier.shape=NA)+ geom_segment(aes(x=1, y=200, xend=1, yend=220))+ geom_segment(aes(x=2, y=200, xend=2, yend=220))+ geom_segment(aes(x=1, y=220, xend=2, yend=220))+ annotate("text", x=1.5, y=230, label="P>0.05", size=5)+ geom_jitter(size=0.5) 定量数据的组间比较,除了ggplot2本身的方法之外,还可以借助其他的工具,如ggpubr包来帮助标注P值,有兴趣可以自学。 二、定性数据组间比较 进行定性数据组间比较,会用到率或构成比两个指标,率一般用直条图表示,构成比用圆饼图表示。 1、不同组率之间的比较(直条图) 如果我要分析男女的失眠率进行比较分析,可用条形图将率反应出来,并将率标注在图形当中。 在进行绘图之前,还是要对原数据进行转化 by_sex<-group_by(newdata,sex) newdata2<-summarise(by_sex,N=n(),n=mean(insomnia==1)) #当mean里面是逻辑符时,表示TRUE的比例,计算原始数据的失眠率 View(newdata2) 下图就是对不同性别失眠率的直条图 1)绘制不同性别的失眠率条形图 ggplot(newdata2, aes(x=sex, y=precent))+ geom_bar(stat = "identity",width = 0.5,fill="red") 2)在直条图中添加数字标签,保留小数点3位 geom_text(aes(label=round(precent,digits = 3)),colour="black",vjust=2) #label表示要绘制的标签,round对标签的小数点进行控制,colour表示标签的颜色,vjust表示标签的的位置。 直条图:完整的代码 ggplot(newdata2, aes(x=sex, y=precent))+ geom_bar(stat = "identity",width = 0.5,fill="red")+ geom_text(aes(label=round(precent,digits = 4)),colour="black",vjust=2) 2、数据构成比的描述 如果我想要描述睡眠状况在老年人群中的分布情况,就可以利用到构成图,绘制也较简单,其中利用坐标系对直条图进行了转化 1)先绘制直条图,用不同颜色表标各部分所占的比例 ggplot(newdata, aes(x = "", fill = huji)) + geom_bar(width = 1) 2)利用坐标第对坐标轴进行调整 coord_polar(theta = "y", start=0) #theta表示利用y的值,start表示从0开始 圆饼图:完整代码 ggplot(newdata, aes(x = "", fill = sleep)) + geom_bar(width = 1) + coord_polar(theta = "y", start=0) 以上就是在对数据进行比较分析的时候最常用的四种图型,后续将会给大家介绍重复测量数据,关联性数据绘图方法。 DAY19的内容就介绍到这里! |
|