本文首发于“生信补给站”公众号 ggplot2|详解八大基本绘图要素
"一张统计图形就是从数据到几何对象(geometric object, 缩写为geom, 包括点、线、条形等)的图形属性(aesthetic attributes, 缩写为aes, 包括颜色、形状、大小等)的一个映射。此外, 图形中还可能包含数据的统计变换(statistical transformation, 缩写为stats), 最后绘制在某个特定的坐标系(coordinate system, 缩写为coord)中, 而分面(facet, 指将绘图窗口划分为若干个子窗口)则可以用来生成数据中不同子集的图形。"
----- Hadley Wickham
一 ggplot2 背景介绍
ggplot2是由Hadley Wickham创建的一个十分强大的可视化R包。按照ggplot2的绘图理念,Plot(图)= data(数据集)+ Aesthetics(美学映射)+ Geometry(几何对象)。本文将从ggplot2的八大基本要素逐步介绍这个强大的R可视化包。
- 数据(Data)和映射(Mapping)
- 几何对象(Geometric)
- 标尺(Scale)
- 统计变换(Statistics)
- 坐标系统(Coordinante)
- 图层(Layer)
- 分面(Facet)
- 主题(Theme)
二 数据(data) 和 映射(Mapping)
数据:用于绘制图形的数据,本文主要使用经典的mtcars数据集和diamonds数据集子集为例来画图。
#install.packages("ggplot2") library(ggplot2) data(diamonds) set.seed(1234) diamond <- diamonds[sample(nrow(diamonds), 2000), ] head(diamond) # A tibble: 6 x 10 carat cut color clarity depth table price x y z <dbl> <ord> <ord> <ord> <dbl> <dbl> <int> <dbl> <dbl> <dbl> 1 0.91 Ideal G SI2 61.6 56 3985 6.24 6.22 3.84 2 0.43 Premium D SI1 60.1 58 830 4.89 4.93 2.95 3 0.32 Ideal D VS2 61.5 55 808 4.43 4.45 2.73 4 0.33 Ideal G SI2 61.7 55 463 4.46 4.48 2.76 5 0.7 Good H SI1 64.2 58 1771 5.59 5.62 3.6 6 0.33 Ideal G VVS1 61.8 55 868 4.42 4.45 2.74
映射:aes()函数是ggplot2中的映射函数, 所谓的映射即为数据集中的数据关联到相应的图形属性过程中一种对应关系, 图形的颜色,形状,分组等都可以通过通过数据集中的变量映射。
#使用diamonds的数据子集作为绘图数据,克拉(carat)数为X轴变量,价格(price)为Y轴变量。
p <- ggplot(data = diamond, mapping = aes(x = carat, y = price))
#将钻石的颜色(color)映射颜色属性:
p <- ggplot(data=diamond, mapping=aes(x=carat, y=price, shape=cut, colour=color)) p+geom_point() #绘制点图
#将钻石的切工(cut)映射到形状属性:
p <- ggplot(data=diamond, mapping=aes(x=carat, y=price, shape=cut)) p+geom_point() #绘制点图
#将钻石的切工(cut)映射到分组属性:
#默认分组设置, 即group=1 p + geom_boxplot() #分组(group)也是ggplot2种映射关系的一种, 如果需要把观测点按额外的离散变量进行分组处理, 必须修改默认的分组设置。 p1 <- ggplot(data=diamond, mapping=aes(x=carat, y=price, group=factor(cut))) p1 + geom_boxplot() 注意:不同的几何对象,要求的属性会有些不同,这些属性也可以在几何对象映射时提供,以下语法与上面的aes中是一样的。 #结果与上述一致 ggplot(data = diamond)+geom_point(aes(x=carat, y=price, colour=color)) ggplot(data = diamond) +geom_point(aes(x=carat, y=price, shape=cut)) ggplot(data = diamond) +geom_boxplot(aes(x=carat, y=price, group=factor(cut))) ggplot(data = diamond) +geom_point(aes(x=carat, y=price, colour=color,shape=cut))
注:ggplot2支持图层,可以把不同的图层中共用的映射提供给ggplot函数,而某一几何对象才需要的映射参数提供给geom_xxx函数。
三 几何对象(Geometric)
几何对象代表我们在图中实际看到的图形元素,如点、线、多边形等。数据与映射部分介绍了ggplot函数执行各种属性映射,只需要添加不同的几何对象图层,即可绘制出相应的图形。
此处介绍几种常用的几何对象,geom_histogram用于直方图,geom_bar用于画柱状图,geom_boxplot用于画箱式图等。
直方图
单变量连续变量:可绘制直方图展示,提供一个连续变量,画出数据的分布。
#以价格(price)变量为例,且按照不同的切工填充颜色
ggplot(diamond)+geom_histogram(aes(x=price, fill=cut))
#设置position="dodge",side-by-side地画直方图
ggplot(diamond)+geom_histogram(aes(x=price, fill=cut), position="dodge")
#设置使用position="fill",按相对比例画直方图
ggplot(diamond)+geom_histogram(aes(x=price, fill=cut), position="fill")
柱状图
单变量分类变量:可使用柱状图展示,提供一个x分类变量,画出数据的分布。
#以透明度(clarity)变量为例,且按照不同的切工填充颜色,柱子的高度即为此分类下的数目。
ggplot(diamond)+geom_bar(aes(x=clarity, fill=cut))
注:ggplot2会通过x变量自动计算各个分类的数目。
#直接指定个数,需要通过stat参数,指定geom_bar按特定高度画图
ggplot()+geom_bar(aes(x=c(LETTERS[1:5]),y=1:5), stat="identity")
区分与联系:
直方图把连续型的数据按照一个个等长的分区(bin)切分,然后计数画柱形图。
柱状图是把分类数据,按类别计数。
箱式图
箱线图通过绘制观测数据的五数总括,即最小值、下四分位数、中位数、上四分位数以及最大值,描述了变量值的分布情况。同时箱线图能够显示出离群点(outlier),通过箱线图能够很容易识别出数据中的异常值。
#按切工(cut)分类,对价格(price)变量画箱式图,再按照color变量分别填充颜色。
ggplot(diamond,aes(x=cut, y=price,fill=color))+geom_boxplot()
ggplot(diamond)+geom_boxplot(aes(x=cut, y=price,fill=color))
以上可见,通过映射和几何对象就可以将数据集中的变量数值变成几何图形以及几何图形的各种图形元素。
注:每一种几何对象所能涉及的aes()类型有区别,在绘制对应对象的时候,要注意选择正确的映射方式,以下仅供参考:
geom | stat | aes |
geom_abline | abine | colour,linetype,size |
geom_area | identity | colour,fill,linetype,size,x,y |
geom_bar | bin | colour,fill,linetype,size,weight,x |
geom_bin2d | bin2d | colour,fill,linetype,size,weight,xmax,xmin,ymax,ymin |
geom_blank | identity | |
geom_boxplot | boxplot | colour,fill,lower,middle,size,upper,weight,x,ymax.ymin |
geom_contour | contour | colour,linetype,size,weight,x |
geom_crossbar | identity | colour,fill,linetype,size,x,y,ymax,ymin |
geom_density | density | colour,fill,linetype,size,weight,x,y |
geom_density2d | density2d | colour,linetype,size,weight,x,y |
geom_dotplot | bindot | colour,fill,x,y |
geom_errorbar | identity | colour,linetype,size,width,x,ymax,ymin |
geom_errorbarh | identity | colour,linetype,size,width,x,ymax,ymin |
geom_freqpoly | bin | colour,linetype,size |
geom_hex | binhex | colour,fill,size,x,y |
geom_histogram | bin | colour,fill,linetype,size,weight,x |
geom_hline | hline | colour,linetype,size |
geom_jitter | identity | colour,fill,shape,size,x,y |
geom_line | identity | colour,linetype,size,x,y |
geom_linerange | identity | colour,linetype,size,size,x,ymax,ymin |
geom_map | identity | colour,fill,linetype,size,x,y,map_id |
geom_path | identity | colour,linetype,size,x,y |
geom_point | identity | colour,fill,shape,size,x,y |
geom_pointrange | identity | colour,fill,linetype,shape,size,x,ymax,ymin |
geom_polygon | identity | colour,fill,linetype,size,x,y |
geom_quantile | quantile | colour,linetype,size,weight,x,y |
geom_raster | identity | colour,fill,linetype,size,x,y |
geom_rect | identity | colour,fill,linetype,size,xmax,xmin,ymax,ymin |
geom_ribbon | identity | colour,fill,linetype,size,x,ymax,ymin |
geom_rug | identity | colour,linetype,size |
geom_segment | identity | colour,linetype,size,x,xend.y.yend |
geom_smooth | smooth | aplha,colour,fill,linetype,size,weight,x,y |
geom_step | identity | colour,linetype,size,x,y |
geom_text | identity | angle,colour,hjust,label,size,size,vjust,x,y |
geom_tile | identity | colour,fill,linetype,size,x,y |
geom_violin | ydensity | weigth,colour,fill,size,linetype,x,y |
geom_vline | vline | colour,linetype,size |