BGI-College生信入门——9、R语言基础(二)
ggplot2
Elegant Graphics for Data Analysis,用于数据分析的精美图形
ggplot2是一个用于数据统计和绘图的R包
与其它绘图包不同,ggplot2有自己的基础语法
ggplot2的逻辑就是基于图层的概念,把一张统计图中涵盖的元素按属性可以分成5大类:
几何对象
geometric object,简写成geoms,代表图中的点、线和多边形等
尺度
aesthetic attributes,简写成aes,包括颜色、形状和大小等
数据的统计变换
statistical transformation,简写stats
总结数据,例如分类统计绘制直方图,或总结得出一个二维的线性模型
坐标系
coordinate system,简写coord
通过坐标轴和网格线展示
一般采用笛卡尔坐标系,同时支持其它坐标系(极坐标、地图投射等)
分面
facet,指定绘图窗口划分为若干个子窗口
熟悉PS的朋友可能知道,在PS里绘图我们通过不断新建图层达到添加新元素的目的,ggplot2的图层概念与之类似
安装ggplot2
install.packages("ggplot2")
使用qplot绘制简单图形
ggplot2内置的数据集
绘图所用数据集为ggplot2内置的diamonds,该数据是53,940个钻石的价格和品质信息
钻石的4C标准:carat(克拉)、cut(切工)、color(色泽)和clarity(透明度)
head(diamonds)
carat cut color clarity depth table price x y z
0.23 Ideal E SI2 61.5 55 326 3.95 3.98 2.43
0.21 Premium E SI1 59.8 61 326 3.89 3.84 2.31
0.23 Good E VS1 56.9 65 327 4.05 4.07 2.31
0.29 Premium I VS2 62.4 58 334 4.2 4.23 2.63
0.31 Good J SI2 63.3 58 335 4.34 4.35 2.75
0.24 Very Good J VVS2 62.8 57 336 3.94 3.96 2.48
图1 x、y、z、table和depth的测量方式另外我们会从diamonds数据中随机产生一个包含100个钻石品质信息的数据子集dsmall
set.seed(2022)#设置随机数种子,根据种子编号产生可重复的伪随机数
dsmall <- diamonds[sample(nrow(diamonds), 100), ]#产生拥有100个钻石信息的小数据集
qplot绘制散点图
图2 钻石的重量(克拉)和价格的关系qplot(carat, price, data = diamonds)
变换变量
图3 钻石重量(克拉)的对数和价格对数的关系qplot(log(carat),log(price), data = diamonds)
映射颜色、大小、形状和其它几何属性
颜色的映射
图4 根据钻石的色泽(color)对散点进行颜色分类qplot(carat, price, data = dsmall, colour = color)
大小的映射
图5 将x、y、z的乘积映射到散点的大小qplot(carat, price, data = dsmall, size = x*y*z)
形状的映射
图6 根据钻石的切工(cut)对数据划分同形状qplot(carat, price, data = dsmall, shape = cut)
手动设置相关几何属性
图7 自定义所有散点颜色为红色qplot(carat, price, data = dsmall, colour = I("red"))#自定义颜色
图8 自定义所有散点大小为5qplot(carat, price, data = dsmall, size = I(5))#自定义大小
图9 自定义散点形状为三角形qplot(carat, price, data = dsmall, shape = I("triangle"))#自定义散点形状为三角形
图10 设定散点透明度为默认的1/10 图11 设定散点透明度为默认的1/100qplot(carat, price, data = diamonds, alpha = I(1/10))#自定义透明度为默认的1/10
qplot(carat, price, data = diamonds, alpha = I(1/100))#自定义透明度为默认的1/100
绘制几何图形
图12 给散点图增加拟合曲线qplot除了能绘制一般的散点图,还可以绘制一些二维的几何图形
qplot(carat, price, data = dsmall, geom ="point")#提供x,y时,qplot()默认绘制散点图
qplot(carat, price, data = dsmall, geom = c("point","smooth"))#增加平滑的拟合曲线
图13 钻石不同切工(cut)下价格的分布情况qplot(cut, price, data = dsmall, geom ="boxplot")#绘制箱线图以总结点的分布情况
qplot(date, unemploy/pop, data = economics, geom ="line")#绘制数据之间的连线,用于观察时间和其它变量的关系
由于diamonds数据中没有时间变量,这里使用内置数据集economics作为演示
图14 随时间推移失业率的变化曲线
一维数据绘图
连续变量
qplot(carat, data = diamonds, geom ="histogram")#绘制直方图
图15 钻石重量(carat)的频数直方图
qplot(color, price/carat, data = diamonds, geom ="jitter")#绘制抖动散点图
图16 钻石不同色泽的单价分布
经常做GWAS分析的朋友想必非常熟悉,这个抖动散点图不就是曼哈顿图吗
图17 钻石分布密度qplot(carat, data = diamonds, geom ="density")#绘制密度分布图
离散变量
图18 钻石切工分布条形图qplot(cut, data = diamonds, geom ="bar")#绘制条形图
faceting分面
它根据某个变量拆分数据为子集,并以相同的排列展示方便比较每个子集
qplot(carat, data = diamonds, facets = cut ~ .,geom ="histogram", binwidth = 0.01, xlim = c(0, 2))#这里根据钻石的切工(cut)进行分面,绘制直方图并设定箱宽为0.01,x轴范围在0~2
图19 以钻石切工为条件显示钻石重量的分布情况