《R数据可视化手册》之—善变的散点图

作者:文艺

审核:文涛

《R数据可视化手册》之——善变的散点图

写在前面

散点图是文献中常见的可视化图形,同时也是基本可视化方式之一,在R语言中得到很好的支持,尤其是ggplot2。本小结结合R语言可视化手册进行散点图的整合。其中修改了一些目前R包不在支持的函数。方便大家运行。

如何理解散点图

散点图中点表示某个观测样本,而点的位置又由变量的取值大小决定。除了决定散点位置的横纵坐标外,还有诸如图形的颜色、大小、形状等 每个图形参数在R中都可由一个变量来表示,比如fill,shape,colour.

散点图和其他统计图有这样的联系 在散点图中,我们用点来表示每个样本观测,若改用直线连接所有观测,就会得到折线图;若用条形来表示样本观测,则会变成柱形图。

通过文献中的例子深入理解散点图

在微生物组方向的文章中散点图常用与排序分析,聚类分析,普氏分析,线性相关等

我们结合<Most dominant roles of insect gut bacteria:digestion, detoxification, or essential nutrient provision?>这篇文献中讲述的关于昆虫和肠道微生物互作的文献中的点图来深入理解一下:

如图8a所示,整体上看对于基因组学和蛋白质组学的功能聚集在反对角线上分组较明显,蛋白质主要聚集在上三角形,基因组学测出的代谢功能主要聚集在下三角形,这表明除了脂质消化、碳水化合物消化和PSM降解外,蛋白质组和基因组数据之间存在显著的差异。而b图就通过点表示某个昆虫两边的线段更清晰地表现出蛋白组和基因组之间的变异程度。

点图有哪些形式?

  1. Cleveland点图又称棒棒糖图和滑珠散点图,实际是条形图或柱状图的升级,一个变量一般是连续变量,另一个是因子型变量,它通过线段代替了条形图中的矩形,更多关注的是数据本身的展示,尤其是当数据较多时,点图化繁为简,基于它的属性,Cleveland点图更适用于排序,对于不同的分类变量依对应数值进行排序展示出来

    1. 添加地毯的点图,横纵坐标下的地毯小竖线的密集程度代表在这个坐标值附近数据密集程度,数据密集处的xy变量值可以直接看到,无需估计.

    2. Wilkinson点图:Wilkinson圆中的y轴刻度线没有明确的含义, 可以使用scale_y_continuous()函数和theme()移除y轴标签,对比图如下两张图。

      如下例子#我们取2009年人均收入>2000的数据子集,并为其加上了一个”地毯”

      library(gcookbook)
      library(ggplot2)
      countries2009<-subset(countries,Year==2009&healthexp>2000)
      p<-ggplot(countries2009,aes(x=infmortality))
      p+geom_dotplot(binwidth = .25,stackdir = "centerwhole")+
      geom_rug()+scale_y_continuous(breaks = NULL)+
      theme(axis.title.y = element_blank())

  1. 叠加箱线图的分组居中聚集的点图,数据在x轴方向上进行分组,利用binaxis = “y”使数据点沿着y轴堆叠,叠加箱线图点要空心fill=NA,而且要隐去箱线图的异常点(outlier.colour=NA)否则会被作为点图的一部分展示出来.这种点图可以看到箱线图的五个统计值和数据堆叠的之间的情况.

library(gcookbook)
library(ggplot2)
ggplot(heightweight,aes(x=sex,y=heightIn))+
geom_boxplot(width=.4,outlier.color = NA)+
geom_dotplot(binwidth = .5,stackdir = "center",binaxis = "y",fill=NA)

  1. 分组散点图,这里这张图进行了两个分组,将性别映射给点的形态,将hw中weightlb按是否超过100磅分为两组映射给”填充”.

    library(gcookbook)
    library(ggplot2)
    hw<-heightweight
    hw$weightGroup<-cut(hw$weightLb,breaks=c(-Inf,100,Inf),labels = c("<100",">=100"))
    ggplot(hw,aes(x=ageYear,y=heightIn,shape=sex,fill=weightGroup))+geom_point(size=2.5)+scale_shape_manual(values = c(21,24))+
    scale_fill_manual(values = c("white","black"),guide=guide_legend(override.aes = list(shape=21)))

  1. 添加了模型拟合线的散点图

library(gcookbook)
model<-lm(heightIn~ageYear+I(ageYear^2),heightweight)
#利用lm函数建立以ageyear为自变量对因变量heightin的预测模型
xmin<-min(heightweight$ageYear)
xmax<-max(heightweight$ageYear)
predicted<-data.frame(ageYear=seq(xmin,xmax,length.out = 100))
#创建一个数据框长度为100,包含ageyear,x区间为min~max,用来计算预测值的数据框
predicted$heightIn<-predict.lm(model,predicted)
#数据框predicted的预测值heightIn,用上面建立的model在predicted中的x区间内用predict计算
sp<-ggplot(heightweight,aes(x=ageYear,y=heightIn))+geom_point(colour="grey40")#将实际数据点绘制出来
sp+geom_line(data=predicted,size=1)
#在实际数据点图基础上加上计算出来的模型预测
sp+geom_line(data = predicted,size=1)+
geom_smooth(method = lm,colour="red",se=FALSE)+
geom_smooth(method = loess,colour="blue",se=FALSE)#

#predictvals函数可以简化像散点图添加模型拟合线的过程

predictvals<-function(model,xvar,yvar,xrange=NULL,sample=100,...){
if(is.null(xrange)){
if(any(class(model)%in%c("lm","glm")))xrange<-range(model$model[[xvar]])
else if(any(class(model)%in%"loess"))
xrange<-range(model$x)
}
newdata<-data.frame(x=seq(xrange[1],xrange[2],length.out = sample))
names(newdata)<-xvar
# str(newdata)
newdata$heightIn <-predict(model,newdata = newdata,...)
return(newdata)
}

modlinear<-lm(heightIn~ageYear,heightweight)
modloess<-loess(heightIn~ageYear,heightweight)
#调用lm和loess函数对数据集建立线性模型和loess模型
loess_predicted<-predictvals(modloess,"ageYear","heightIn")#针对两个模型调用predictvals函数
#向散点图中添加回归模型拟合线
sp+geom_line(data=lm_predicted,colour="red",size=.8)+geom_line(data=loess_predicted,colour="blue",size=.8)
library(MASS)
b<-biopsy
b$classn[b$class=="benigh"]<-0
b$classn[b$class=="malignant"]<-1
fitlogistic<-glm(classn~V1,b,family=binomial)

#添加来自多个模型的拟合线
make_model<-function(data){Lm(heightIn~ageYear,data)}#定义一个函数makemodel,向这个函数输入一个数据框就会返回一个lm对象
library(plyr)
models<-dlply(heightweight,"sex",fun=make_model)#利用dlply函数根据性别对height weight进行分组
models#被分组产生两个模型,一个为男,一个为女
predvals<-ldply(models,fun=predictvals,x="ageYear",y="heightIn")#这里和R可视化书上,83页的x,y表示有所出入

7.变量值映射给面积的气泡图

8.将数据分箱的点图,六边形,当数据点特别多的时候我们可以考虑分箱处理,将点变为矩形或六边形并改变透明度以减少数据点之间的重叠,并赋予颜色,由图可知颜色由蓝变红密度逐渐变大。

library(ggplot2)
sp<-ggplot(diamonds,aes(x=carat,y=price))#取数据diamond中自变量为克拉,因变量为价格。
library("hexbin")
sp+stat_binhex(bins = 30)+scale_fill_gradient(low="lightblue",high = "red",breaks=c(0,250,500,1000,2000,4000,6000),limits=c(0,6000))

  1. 将密度映射给填充色的2D图,下面这三个图都是一个意思,只是映射的变量值不同

    二维散点图

    带数据点并将点密度映射给alpha的瓦片图

微生信生物简介

微生信生物已经创立三年有余了,在这几年中,感谢铁杆分析的支持,同时希望越来越多的小伙伴加入微生信生物大家庭,目前微生信交流群已经超过2000人。帮助许多小伙伴解决的大量问题。

关注统计分析和出图,关注各大组学数据分析流程和各种高级分析。专注解决尚未解决的问题,在分析领域著重创新,时间,问题解决,用于探索发现。

关注R语言,python,perl,shell等语言使用。定期分分享相关学习指南。R语言是使用的比较多的分析语言,会用大量的R语言教程。

根际互作生物学研究室 简介

根际互作生物学研究室是沈其荣教授土壤微生物与有机肥团队下的一个关注于根际互作的研究小组。本小组由袁军副教授带领,主要关注:1.植物和微生物互作在抗病过程中的作用;2 环境微生物大数据整合研究;3 环境代谢组及其与微生物过程研究体系开发和应用。团队在过去三年中在 isme J, Microbiome, PCE,SBB,Horticulture Research等期刊上发表了多篇文章。欢迎关注 微生信生物 公众号对本研究小组进行了解。

(0)

相关推荐