简介
在R里,主要有两大底层图层系统,一是base图形系统,二是gird图形系统。lattice包与ggplot2包正是基于gird图形系统构建的,他们都有自己独特的图形语法。
ggplot2有着自己独特的图形语法,这套语法归纳起来包括:数据(data)、转换(transformation)、度量(scale)、坐标系(coordinate)、元素(element)、指引(guide)、显示(display)等一系列独立的步骤,我们就是通过将这些步骤组合搭配,才实现个性化的统计绘图。相较于其他的绘图包,ggplot2的精髓在于“+”的引入,理论上他能够在一张图上实现无数种元素的添加与修改。
ggplot2图形语法
总体框架:
ggplot2主张模块间的协调雨分工,基本语法框架框架主要包括数据绘图部分与美化细节部分。
数据绘图部分包括:几何图层(统计变换)+坐标系变换+度量调整+分面系统。
美化细节部分包括:图例调整+图表主题设定+数据标签的添加+添加自定义注释+标题、副标题、备注、
每个部分又可以细分很多相关函数与参数
语法的特点是:
(1)采用图层设计方式,有利于用结构化思维实现数据的可视化。有明确的起始(ggplot()开始)与终止,图层之间的叠加是依靠“+”来实现的,如果熟悉PS的话,就能很好的理解图层的概念,类似的,越靠后,图层越位于图像的最上层。通常一条geom_xxx()函数或stat_xxx()函数就可以绘制一个图层。
(2)将表征数据与图层细节设定分开。能够使数据的使用更加条理清晰,而且使用stat_xxx()函数能够将常见的数据统计变换在图层上展示出来。
(3)功能灵活,扩展包(extension package)丰富,有专门调整颜色(color)、字体(font)和主题(theme)等的辅助包。选择恐惧症慎入。
基本语法结构如下:
ggplot(data = 'DATA', mapping = aes('MAPPINGS'),stat = 'STATA', poision = 'POISION')+
#上面两行就是基础图层,不会出现图形geom_xxx()丨stat_xxx() + #这是几何图层或统计变化,这时候就会出现图形#上面三行是出现图形锁必须的scale_xxx()+ #标度调整,调整具体的标度coord_xxx()+ #坐标变换,默认笛卡尔坐标系facet_xxx()+ #分面系统,按照谋个变量进行分面变换guides()+ #图例调整theme() #主题设定
必须的图形信息:
(1)ggplot():底层绘图函数。DATA为数据集,主要是数据框(data.frame)格式的数据集;MAPPINGS是变量的视觉通道映射(MPAAINGS的具体形式如aes(x = var1, y = var2, color = var3 ……)),用来表示变量x和y,还可以用老控制颜色(color)、大小(size)或形状(shape)等视觉通道;STAT表示统计变换,与stat_xxx()函数想对应,默认是“identity”(即无数据变换);POISIONS表示绘图数据系列的位置调整,默认为“identity”(即无位置调整)。
(2)geom_xxx()丨stat_xxx():集合图层或统计变换,比如常见的geom_point()(散点图)、geom_bar()(柱状图)、geom_histogram()(统计直方图)、geom_boxplot()(箱形图)、geom_line()(折线图)等。我们通过geom_xxx()函数就可以绘制大部分的图表,但是有时候还需要设定stat参数进行统计变换。
可选的图形信息:
(1)scale_xxx():度量调整,调整具体的度量,包括颜色(color)、大小(size)或形状(shape)等,跟MAPPINGS的映射变量相对应。
(2)coord_xxx():坐标变换,默认笛卡尔坐标系,还包括极坐标、地理空间坐标等。
(3)facet_xxx():分面系统,将某个变量进行分面变换,包括按行、列和网格等形式分面绘图。
(4)guides():调整图例,主要包括连续性和离散型两种类型的图例。
(5)theme():主题设定,主要用于调整图表的细节,包括背景颜色,网格线的间隔与颜色等。
具体语法:
总体框架包括了很多的生僻名词,要想对他有更深入的理解,只有在具体的实例中才能找到感觉,知道其定义或者特点框架什么的,并不能让你做出来自己的图形,只能让你看得懂别人写的图形,但是,一步步来呗。
geom_xxx()与geom_xxx()
(1)geom_xxx():几何对象函数
ggplot2包中包含几十种不同的几何对象函数geom_xxx(),以及统计变换函数stat_xxx()。大部分时间,我们主要使用的是集合对象函数geom_xxx(),只有当绘制的图形涉及统计变换时,我们才需要使用统计变换函数stat_xxx(),例如绘制带有误差线的均值散点图或者柱形图等。当使用ggplot2绘制图形时,其原理过程就如下图所示:
(2)stat_xxx():统计变换函数
统计(stat)转换函数在数据被绘制出来之前对数据进行聚合和其他计算。stat_xxx()确定了数据的计算方法。不同方法的计算会产生不同的结果,所以一个stat_xxx()函数必须与一个geom_xxx()函数对应才能进行数据的计算。在某些特殊类型的统计图形制作过程中(比如柱状图、直方图、平滑曲线图、概率密度曲线图、箱形图等),数据对象在向几何对象的视觉信号映射过程中,会做特殊的转换,也称统计变换过程。图层的命名就是函数,用stat_xxx()命名图层能够很好的让作者聚焦于统计变换过程,其原理过程如下图:
关于geom_xxx()函数和stat_xxx()函数,我们都可以将其视作一个图层,并且大多是成对出现的,绘图效果也相似,但并不相同。每一个图层都包含一个几何对象和统计变换,也即每一个以geom_xxx()开头的几何对象都包含一个stat参数,同时每一个stat_xxx()开头的几何对象都包含一个geom参数。那么为什么要分成这两个开头来命名呢:
1)以stat_xxx()开始的图层,在制作这些特殊的统计图形时,我们无需设定统计变换参数(因为这个 图层函数的开头就已经声明了),但这时候仍需指定集合对象名称的图表类型geom,就可以绘制与之相对应的统计类型图表。这样只需要变换geom参数,就可以根据统计变换结果绘制不同的图表,可以使得作图过程更加侧重统计变换过程。
2)以geom_xxx()开始的图层,则更加侧重图表类型的绘制,而通过修改统计变换参数,也可以实现绘图前数据的统计变换,如绘制均值散点,可见下面语句,上面的是使用指定geom=‘point’(散点)的stat_summary()语句,下面的是使用指定stat=‘summary’的geom_point()语句,他们所实现的效果是一样的:
ggplot(mydata, aes(class,value, fill = class))+stat_summary(fun.y = 'mean', fun.args = list(mult = 1),geom = 'point',color = 'white',size = 4)ggplot(mydata, aes(class,value, fill = class))+geom_point(fun.y = 'mean',fun.args = list(mult = 1),stat = 'summary',color = 'white', size = 4)
若要绘制带误差线的散点图,可见下面语句,上面的是使用指定geom=‘pointrange’(带误差线的散点)的stat_summary()语句,下面的是使用指定stat=‘summary’的geom_pointrange()语句,他们的效果也一样:
ggplot(mydata, aes(class,value, fill = class))+stat_summary(fun.data = 'mean_sdl', fun.args = list(mult = 1),geom = 'pointrange',color = 'black',size = 1.2)ggplot(mydata, aes(class,value, fill = class))+geom_pointrange(fun.data = 'mean_sdl',fun.args = list(mult = 1),stat = 'summary',color = 'black', size = 1.2)
其中,fun.data表示指定完整的汇总函数,输入数字向量,输出数据框,常见的4种值为:mean_cl_boot、mean_cl_normal、mean_sdl、median_hilow。fun.y表示指定对y的汇总函数,同样是输入数字向量,返回单个数字的median或mean等,这里的y通常会被分组,汇总后是每个组产生一个数字。
当绘制的图形不涉及统计变换时,我们可以直接使用geom_xxx()函数,也无需设定stat参数,因为会默认‘identity’无变换。只有设计数据变换处理时,我们才需要使用更改stat参数,或者直接使用stat_xxx()函数来强调统计变换。
这是绘图所需要的最基础的内容,有了上述的代码,就可以绘制出来图形,但总是最基础的,简陋、粗糙。
视觉通道映射
什么叫视觉通道映射呢,就是将数据经过一个过程,使其变成想要的图形。就像是函数f(),给一个数字,会返给你一个新的数字,这个过程叫函数的映射。视觉通道就是用于控制几何形状的性质,如几何形状的位置、大小、形状、方向、色调、饱和度、亮度、透明度等等。视觉通道映射就是将数据变成这一种种的性质展示出来。
视觉通道的类型可以分成两种,当我们感知对象的信息是基于对象本身的特征和位置等时,对应的视觉通道的类别就是分类、定性的,如形状、色调、空间位置等;当我们感知对象的信息是基于对象某一属性在数值上的大小时,对应的视觉通道的类别就是定序性质、定量的(连续、有序),如直线的长度,区域的面积,空间的体积,斜度,角度,饱和度和亮度等等。但这两种分类不是绝对不变的,如体积,我们分成大中小倒是也可以的。
回到ggplot2中来,R语言中可以用作视觉通道映射参数的主要包括color/col/colour、fill、size、angle、linetype、shape、vjust和hjust,这其中就包括了分类、定性的视觉通道(如linetype、shape)和定量的视觉通道。
(1)color/col/colour、fill和alpha的属性都是与颜色相关的视觉通道映射参数,其中color/col/colour是指点(point)、线(line)、和填充区域(region)轮廓的颜色;fill是指定填充区域(region)的颜色;alpha是指定颜色的透明度,数值范围从0(完全透明)到1(不透明)。
(2)size是指点(point)的尺寸或线的(line)宽度,默认单位为mm,可以在geom_point()函数绘制的散点图的基础上,添加size的映射从而实现气泡图。
(3)angle是指角度,只有部分集合对象有,如geom_text()函数中文本的摆放角度、geom_spoke()函数中短棒的摆放角度。
(4)vjust和hjust都是与位置调整有关的视觉通道映射参数。其中,vjust是指垂直位置微调,在(0,1)区间的数字或位置字符串:0=‘button’,0.5=‘middle’,1=‘top’,区间外的数字微调比例控制不均;hjust是指水平位置微调,在(0,1)区间的数字或位置字符串:0=‘left’,0.5=‘center’,1=‘right’,区间外的数字微调比例控制不均。
(5)liinetype是指定线条的类型,包括白线(0=‘blank’)、实线(1=‘solid’)、短虚线(2=‘dashed’)、点线(3=‘dotted’)、点横线(4=‘dotdash’)、长虚线(5=‘longdash’)、短长虚线(6=‘towdash’)。
(6)shape是指点的形状,为[0,25]区间的26个整数,分别对应方形、圆形、三角形、菱形等26中不同的形状。有的形状有填充颜色(fill属性),但有的形状只有轮廓颜色(color)的属性。
R中ggplot2的geom_xxx()系列函数,其基础的展示元素可以分成四类:点(point)、线(line)、多边形(polygon)和文本(text),如下图所示的函数,对应四种基础元素。
来个典型的例子,使用geom_point()函数,绘制散点图,通过设定各种视觉通道映射,完成不同视觉效果的显示。数据中有四个变量(age、tua、class、SOD):
.上图使用的参数包括x、y、alpha(透明度)、color(轮廓色)、fill(填充颜色)、group(分组映射的变量)、shape(形状)、size(大小)、stroke(轮廓线条的粗细)。第一张图是将离散数值变量age映射到散点的大小(size),使用scale_size(range=c(ab))调整了散点的大小,range表示视觉通道映射变量转化后气泡面积的映射显示范围。然后散点图就转换成了气泡图,气泡的大小对应于age的数值;第二章图是将age映射到散点的大小(size)和填充颜色(fill)使用scale_fill_distiller(palette=“Reds”)函数将离散型数值变量age映射到红色渐变颜色条,其中,direction=0表示颜色是从前到深渐变的(注意:需要加载RColorBrewer包,才能使用“Reds”颜色主题),ggplot2会自动将填充颜色映射到颜色条(colorbar);图三是将离散类别型变量Class映射到散点的填充颜色(fill)使用scale_xxx_manual()手动定义fill和shape的度量,ggplot2会自动将不同的填充颜色对应类别的数据点。从而绘制多数据系列的散点图;图四是将离散型数值型变量age和离散类别型变量Class分别映射到散点大小和填充颜色(fill)然后scale_size()和scale_fill_manual()分别调整气泡大写(size)的映射范围与填充颜色(fill)的颜色数值。
此外,还有不用做变量视觉通道映射的参数,就是这些参数的参数值不需要有数据的支持,而是有指定的值,如:字体(family)和字型(fontface)。其中,字型分为:plain(常规体)、bold(粗体)、italic(斜体)、bold.italic(粗斜体)。常用语geom_text()等文本对象函数;字体内置的有三种:sans、serif、mono,但是可以通过扩展包extrafont来将其他字体转换为ggplot2可识别的标准形式,还可以通过showtext包以图片的形式将字体插入到ggplot2绘制的图表中。其中的scale_xxx_manual()等是用于度量的调整,见下。
度量调整
度量用于控制变量映射到是绝对想的具体细节,比如:X轴和Y轴、alpha(透明度)、color(轮廓颜色)、fill(填充颜色)、lineshape(线条形状)、shape(形状)等,他们都有相应的度量函数。根据视觉通道映射的变量属性,将度量调整函数分成数值型和类别型两大类。ggplot2的默认度量为scale_xxx_identity()。scale_xxx_manual()表示手动自定义离散的度量,包括colour、fill、alpha、linetype、shape和size等视觉通道映射参数。
度量调整最关键的是要学会合理地使用视觉通道映射参数,并调整合适的度量。可视化最基本的形式就是简单的把数据映射成彩色图形。他的工作原理就是大脑倾向于寻找模式,你可以在图形和她所代表的的数字间来回切换。关于人们对图形感知的精确性,有学者做了研究,我们能用到的视觉暗示通常由长度、面积、体积、角度、弧度、位置、方向、形状和颜色(色相和饱和度)。所以正确的选择哪些视觉暗示就取决于自己对形状、颜色、大小的理解,以及数据本身个目标。不同的视觉暗示组合能够更好的促进读者理解图表的数据信息,有学者总结各种视觉暗示组合的特点:
需要注意的是,对于视觉通道的映射,存在讲映射放在ggplot(,aes())的aes()中和放在外部scale_xxx_manual()的矛盾,那么,何时应该在aes()内部,何时应该在aes()外部呢?
当我们制定的视觉通道映射参数需要进行个性化映射时(即一个一个的映射),应该写再aes()的内部,即每个观测值都会按照我们制定的特定变量值进行个性化的设定。典型的情况是需要添加一个维度,将这个维度按照颜色、大小、线条等方式针对维度向量中每一个记录值进行一对一的设定。
当我们需要统一设定某些图表元素对象(共性,统一化)时,此时应该将其参数指定在aes()函数的外部,即所有观测值都会按照统一属性进行映射,例如size=5,linetype=‘dash’,color=‘blue’。典型的情况就是需要统一所有点的大小、颜色、形状、透明度,或者线条的颜色、粗细、形状等,这种情况下不会消耗我们数据源中任何一个维度或者度量指标,仅仅是对已经呈现出来的图形元素的外观属性进行统一的设定。
坐标系
在编码数据的时候,徐亚吧数据系列放到一个结构化的空间中,即坐标系他赋予X轴、Y轴坐标或给出经纬度表示的意义,常用坐标有直角坐标系(rectangular coordinate)、极坐标系(polar coordinate)和地理坐标系(geographic coordinate)。他们几乎可以满数据可视化的所有需求。
直角坐标系:
也叫笛卡尔坐标系,是最常用的坐标系,ggplot2的直角坐标系包括coord_cartesian()、coord_fixed()、coord_flip()和coord_trans()四种类型。ggplot2中默认的类型为coord_cartesian(),其它坐标系都是通过直角坐标系画图,然后变换过来的。coord_fixed()是固定纵横比,比如在绘制华夫饼图和复合型散点饼图的时候,我们需要使纵横比为1:coord_fixed(ratio=1);coord_flip()用于翻转坐标系,如在绘制条形图或者水平箱形图时,就需要将X轴和Y轴坐标对换,从而可以将竖直的柱形图转换成水平的条形图;coord_trans()坐标系上刻度比例尺是不断变化的,这种做辨析很少应用。
三维直角坐标系的投影方法在绘图软件中,有投影这个参数:正交投影(orthography projection)和透视投影(perspective projection),不管是plot3D还是lattice包的三维图表绘制函数,都存在这样一个参数可以调整三维坐标系的透视程度。直角坐标系该可以扩展到多维空间。例如三维空间可以用(X,Y,Z)三个值对来表示三维空间中数据点的位置,如果再拓展到平行坐标系(parallel coordinate),则可以用于对高维集合和多元数据的可视化,这时我们可以用R中GGally包的ggparcoord()函数实现平行坐标轴的绘制。
极坐标系:
我们使用的雷达图、饼图等就是极坐标系。我们可以用道坐标系的角度和半径。极坐标系上的任意一点可以用线段的长度P和线段到水平轴的角度来确定。
ggplot2中使用coord_polar()函数可以将坐标系从直角坐标系转换到极坐标系,具体语句为coord_polar(theta= ‘x’, start = 0, direction = 1, clip = ‘on’),其中,theta表示要极坐标化的中心轴,即X周转化为圆周,Y轴转化为半径;direction表示排列方向,1表示顺时针,-1表示逆时针;start表示起始角度,以距离12点针的弧度衡量,具体位置与direction参数有关,若direction为1则在顺时针start角度处,若direction为-1则在逆时针start处。注意:极坐标转化比较耗费计算机资源,最好先用如下语句清空内存:rm(list=is());gc()。
地理坐标系
位置数据最大的好处就在于他与现实世界的联系,用地理坐标系可以映射位置数据。位置数据的形式有很多种,包括经度(longitude)、维度(latitude)、邮编等。通常用经度和维度来描述相对于赤道和子午线的角度。相对于直角坐标系,维度就好比水平轴,经度就好比垂直轴,也就是说相当于是用来平面投影。
由于球面上任何一点的位置都是有地理坐标经纬度(入,中)(就是兰姆达和飞的形似,代号而已)表示的,而平面上的点的位置是用直角坐标(x,y)或极坐标(p,θ)(形似)表示的,所以要想将地球表面上的点转移到平面上,则必须采用一定的方法来确定地理坐标与平面直角坐标或极坐标之间的关系。这种在球面和平面之间建立点与点之间函数关系的数学方法,就是地图投影方法。地图投影的实质就是将地球椭圆面上的地理坐标转化为平面直角坐标。用某种头应该条件将投影球面上的地理坐标点——投影到平面坐标系内,以构成某种地图投影。
地图投影的方法有20多种,其中常用的有墨卡托投影(Mercator projection)、兰伯特等角割圆锥投影(Lamberts conic conformal projection)、Alberd等积正割圆投影等。具体来说,不同区域常用的地图投影方法不同。墨卡托投影又称正轴等角圆柱投影,是一种等角的圆柱形地图投影。以此投影法绘制的地图上,经纬线于任何位置皆垂直相交,使世界地图可以绘制在一个长方形上。由于可显示任两点之间的正确方位,航海用途的海图、航路图大多以此方式绘制。在该投影中线型比例尺在图中任意一点周围都保持不变。从而保持大陆轮廓投影后的角度和形状不变(即等角);但魔卡托投影法会使面积产生变形,极点的比例甚至达到了无穷大。
ggplot2使用coord_map()函数和coord_quickmap()函数可以设定地理坐标系为地理空间坐标系。其中cooed_quickmap()函数是一种保留经纬脂酰的快速近似绘制的地理坐标系,它最适合靠近赤道的较小区域展示。coord_map()函数可以通过设定projection投影参数,从而实现不同投影的地理空降坐标系,包括墨卡托投影、兰伯特等角圆锥投影、Albers等积正割圆锥投影、等距圆柱投影和正交投影等。
坐标系转换
选择合适的坐标系对数据的清晰表达也很重要,直角坐标系与极坐标系的转换如下图所示,使用极坐标系可以将数据以365天围绕圆心排列。极坐标图可以让用户方便的看到数据在周期、方向上的变化趋势,而对连续时间段的变化趋势的显示则不如直角坐标系。
极坐标轴的表示方法为P(p,θ),平面直角坐标系的表示方法为Q(x,y)。极坐标系中的两个坐标p和θ可以由下面的公式转换为直角坐标系的值:
x=pcosθ,y=psinθ
而在直角坐标系中,从x和y两坐标也可以计算出极坐标。要满足x不等于0等
坐标轴度量
坐标系指定了可视化的维度,而坐标轴的度量则指定了再每一个维度里数据映射的范围。坐标轴的度量有很多种,也可以用数学函数定义自己的坐标轴度量。这些坐标轴度量主要分为三种,包括数字(侧重数据的对数变化)、分类坐标轴度量和时间坐标轴度量。其中,数字坐标轴度量包括线性坐标轴度量、对数坐标轴度量、百分比坐标轴度量三类,而分类坐标轴度量包括分类坐标轴度量和顺序坐标轴度量两类。
ggplot2数字坐标轴度量包括:scale_x/y_continous(),scale_x/y_log10(),scale_x/y_sqrt(),scale_x/y_reverse();分类坐标轴度量包括:scale_x/y_discrete();时间坐标轴度量包括:scale_x/y_date(),scale_x/y_datetime(),scale_x/y_time()。这些度量的主要参数包括:name表示指定坐标轴名称,也将作为对应的图例名;breaks表示指定坐标轴刻度,即粗网格线位置;lables表示指定坐标轴刻度标签内容;limits表示指定坐标轴显示范围,支持反向区间;expand表示扩展坐标轴显示范围。trans表示指定坐标轴变换函数,自带有exp()、log()、log10()等,还支持scale包内的其它变换函数,如scale::percent()百分比刻度、自定义等。线性坐标轴度量(linear scale)上的间距处处相等,无论出于坐标轴的什么位置。因此,在尺度的低端测量两点的距离,和在尺度高端测量的结果是一样的。然而,对数坐标轴度量(logarithmic scale)是一个非线性的测量尺度,用在数量有较大范围的差异时。像里氏地震震级、声学中的音量、光学中的光强度、以及溶液的pH值等。对数尺度以数量级为基础,不是一般线性尺度,因此每个刻度之间的商为一定值。若数据有以下特性时,用对数尺度来表示会比较方便:
(1)数据有数量级的差异时,使用对数尺度可以同时显示很大和很小的数据信息;
(2)数据有指数增长或幂定律的特性时,使用对数尺度可以将曲线变为直线表示。
下图就是这两种度量的差异:
#线性尺度
scale_y_continuous(breaks=seq(0,2.1,0.5),limits=c(0,2))
#对数尺度
scale_y_log10((name='log(value)'),limits=c(0.00001,10))
分类坐标轴度量(categorical scale):数据不仅仅包括数值,有时候还包括类别,如不同试验条件、试验样品等测试得到的数据。分类标尺通常和数字标尺一起使用、以表达数据信息。条形图就是水平X轴为数字标尺、垂直Y轴为分类标尺;而柱形图是水平X轴为分类标尺、垂直Y轴为数字标尺。其中条形图和柱形图一个重要的视觉调整参数就是分类间隔,但是他和数值没有关系(如果是多列数据系列,还包括一个视觉参数:系列重叠)。另外,饼图和圆环图也是数字尺度和分类尺度的组合。
注意:对于柱形图、条形图和饼图最好对数据先排序后再进行展示。对于柱形图和条形图,吧数据从大到小排序,最大的位置放在最左边或者最上边。而饼图的数据要从大到小排序,最大的从12点位置开始。
常见的相关性系数图的X轴、Y轴都为分类坐标尺,如下图所示。相关系数图一般都是三维及以上的数据,但是使用二维图表显示。其中X列、Y列都为类别数据,分布对应图表的X轴和Y轴;Z列为数值信息,通过颜色饱和度、面积大小等视觉暗示表示。-下左图使用颜色饱和度和颜色色相综合表示Z列数据;下右图使用方块的面积大小及颜色综合表示Z列数据,从图中很容易观察到那亮度变量的相关性最好。
注:
(1)简单相关系数:又叫相关系数或线性相关系数,一般用字母r表示,用来度量两个变量间的线性关系;
(2)复相关系数:又叫多重相关系数。复相关是指因变量与多个自变量之间的相关关系。例如,某种商品的季节性需求量与其价格水平、职工收入水平等现象之间呈复相关关系。
(3)典型相关系数:是先对原来各组变量进行主成份分析,得到新的线性关系的综合指标,再通过综合指标间的线性相关系数来研究原各组变量间的相关关系。
时间坐标轴度量(time scale):时间是连续的变量,你可以把时间数据画到线性度量上,也可以将其分成时刻、星期、月份、季节、或者年份。我们会常遇见时间序列的数据,时间序列的数据常用柱形图、折线图或者面积图表示,有时候使用极坐标图也可以很好的展示数据,因为时间往往存在周期性,一天(day)、周(week)、月(month)、季(season)或年(year)为一个周期。
需要注意的是:ggplot2时间坐标轴度量函数scale_xxx_date()要求变量是Date格式;scale_xxx_datetime()要求变量是POSIXct格式;scale_xxx_time()要求变量是hms格式。
图例
图例作为图表背景信息的重要部分,对图表的完整性与正确表达尤为重要。ggplot2的guide_colorbar()/guide_colourbar()函数用于调整连续变量的图例;guide_legend()函数用于离散变量的图例,也可以用于连续变量。
guides()函数将guide_colorbar和guide_legebd两种图例嵌套进去,方便映射与处理,如guides(fill=guide_colorbar()),对多个图例共同处理的时候尤为有效。另外,我们也可以在scale_xxx()度量中制定guide类型,guide-'colorbar’或者guide=‘legend’。
其中,尤为重要的部分是图例位置的设定,ggplot2默认是将图例放置在图表的右边(‘right’),但是我们在最后添加的theme()函数中,用legend.poision设定图例的位置。lenged.positiion可以设定为‘right’、‘left’、‘bottom’和’top’。
ggplot2绘图过程中,控制图例在图中的位置利用theme(legend.poision)参数,该参数对应的设置为:‘none’(无图例)、‘left’(左边)、‘right’(右边)、‘bottom’(底部)、‘top’(头部),legend.poision也可以用两个元素构成的数值向量来控制,如吃(0.9,0.7),主要是设置图例在图表中间所在的具体位置,而不是图片的外围。数值大小一般在0~1之间,超出数值往往导致图例隐藏。如果图例通过数值向量设定在图表的具体位置,那么最好同时设定图例背景(legend.background)为透明或者无。
例子:如下图使用的是theme_classic()内置的图表系统主题,使用theme()函数调整图例的具体位置。下左图的默认设定语句为:
theme(legend.background=element_rect(fill='white'),legend.position = 'right')
上述语句表示将图例的背景设为白色填充的矩形,位置设定为图表的右边。
下右图将图例的位置设定为图表内部的左上角,并将图例背景(legend.background)设置为无。其中吃(0.2,0.8)表示图例的位置放在图表内部X轴方向的20%、Y周方向80%的相对位置。
theme(legend.background=element_rect(),legend.position = c(0.2,0.8))
主体系统
主体系统包括绘图区背景、网格线、坐标轴线条等图表的细节部分,而图表风格主要是指绘图区被禁、网格线、坐标轴线条等的格式设定所展现的效果。ggplot2图表的主题系统主要对象包括文本(text)、矩形(rect)和线条(line)三大类,对应的函数包括element_text()、element_rect()、element_line(),另外还有lelment_black()表示该对象设置为无。其中,我们使用比较多的系统对象是坐标轴的标签(axis.text.x、axistext.y)、图例的位置与背景(legend.poision和legend.background)。X周标签(axis.text.x)在绘制极坐标柱形图和径向柱形图时会用于调整X周标签的旋转角度,Y周标签(axis.text.y)也会用于时间序列峰峦图的Y轴标签的替换等。
一般来说,ggplot2主题设置的内部函数及参数非常多,建议用ggThemeAssist包进行主题设置,可以用鼠标操作。
1、ggThemeAaaist包,需要先安装shiny包。安装好之后,在RStudio界面选择‘Tools’—‘Addins’—‘ggplot Theme Assistant’选项,然后直接在交互式弹窗中进行操作。
2、套用主题模板
R语言的主题模板包包括ggthemes、ggtech、ggthemer、ggsci、cowplot等。其中ggsci包就是专门 为学术图表开发的包。ggplot2自带的主题模板也有很多种,包括theme_gray()、theme_minimal()、theme_bw()、theme_light()、theme_test()、theme_classic()等函数。相同的数据及数据格式,可以结合不同的图标风格。
位置调整
在geim_xxx()函数中,参数position表示绘图函数数据系列的位置调整,默认为‘identity’(无位置调整),这个参数在绘制柱形图和条形图系列时经常用到,以绘制簇状柱形图、堆积柱形图和百分比堆积柱形图等。ggplot2位置调整参数如下图所示:
在柱形图和条形图系列中,position的参数有4种:①identity:不作任何位置调整,该情况在多分类柱形图中不可行,序列会遮盖,但是在多序列散点图、折线图中即可行,不存在覆盖问题;②stack:垂直堆叠放置(堆积柱形图);③dodge:水平抖动放置(簇状柱形图,poision=position_dodge());④fill:百分比化(垂直堆叠放置,如百分比对峙面积图、百分比堆积柱形图等)。其中,箱形图和抖动散点图的的位置调整和构造的数据集如下所示。
N <- 100
df <- data.frame(group=rep(c(1,2),each=N*2),y=append(append(rnorm(N,5,1),rnorm(N,2,1)),append(rnorm(N,1,1),rnorm(N,3,1))),x=rep(c('A','B','A','B'),n))
新手工具
对于R语言新手,有个rstudio的插件esquisse:可通过交互操作实现简单的ggplot2图表,自动生成并导出绘图代码,宫用户再做进一步的调整与美化。esquisse的安装可以使用devtools包完成:
devtools::install_github('dreamRs/esquisse')
如果要在Rstudio中启动esquisse,既可以通过点击‘Tools’—‘Addins’—‘ggplot2 builder’选项;也可以在命令框中直接输入:esquisse:::esquisser()。
高手必备
要想熟练使用ggplot2绘制图表,就必须深入理解ggplot与geom对象之间的关系。在实际绘图语句中存在如下图所示的三种情况。在表中的数据构建如下:
N <- 20
df1 <- data.frame(x=sort(rnorm(N)),y=sort(rnorm(N)))
df2 <- data.frame(x=df1$x + 0.1*rnorm(N),y=df1$y + 0.1*rnorm(N))
ggplot与geom对象之间的关系主要体现在如下两点:
①ggplot(data=NULL,mapping=aes())):ggplot内有data、mapping两个参数,具有全局优先级,可以被之后的所有geom对象所继承(前提是geom内未指定相关参数)。
②geom_xxx(data=MULL,mapping=aes()):geom对象内同样有data和mapping参数,但geom内的data和mapping参数属于局部参数,仅用作geom对象内部。
ggplot2包的图形语法大概述了一遍,可以作为了解的大概框架,有很多细节,很多的参数没有提及,也有很多细节处理的功能没有列出来。但是,了解了整体的框架的时候,就能知道如何去查找帮助文档了。总结一下,这些内容的作用只能让自己能读懂现有的代码,并不会让自己能够独立的画出美观的图形,想独立画图,动手多写几次就好了。
参考:R语言数据可视化之美