R语言-ggplot2图形语法

2023-11-13

简介

在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()命名图层能够很好的让作者聚焦于统计变换过程,其原理过程如下图:
stat_count()函数绘制的过程
关于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),如下图所示的函数,对应四种基础元素。
图片来源:R语言数据可视化之美
来个典型的例子,使用geom_point()函数,绘制散点图,通过设定各种视觉通道映射,完成不同视觉效果的显示。数据中有四个变量(age、tua、class、SOD):
图片来源:R语言可视化之美.上图使用的参数包括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等视觉通道映射参数。
图片来源:R语言数据可视化之美”
度量调整最关键的是要学会合理地使用视觉通道映射参数,并调整合适的度量。可视化最基本的形式就是简单的把数据映射成彩色图形。他的工作原理就是大脑倾向于寻找模式,你可以在图形和她所代表的的数字间来回切换。关于人们对图形感知的精确性,有学者做了研究,我们能用到的视觉暗示通常由长度、面积、体积、角度、弧度、位置、方向、形状和颜色(色相和饱和度)。所以正确的选择哪些视觉暗示就取决于自己对形状、颜色、大小的理解,以及数据本身个目标。不同的视觉暗示组合能够更好的促进读者理解图表的数据信息,有学者总结各种视觉暗示组合的特点:
图片来源:R语言数据可视化之美
需要注意的是,对于视觉通道的映射,存在讲映射放在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天围绕圆心排列。极坐标图可以让用户方便的看到数据在周期、方向上的变化趋势,而对连续时间段的变化趋势的显示则不如直角坐标系。

图片来源:R语言数据可视化之美
极坐标轴的表示方法为P(p,θ),平面直角坐标系的表示方法为Q(x,y)。极坐标系中的两个坐标p和θ可以由下面的公式转换为直角坐标系的值:
x=pcosθ,y=psinθ
而在直角坐标系中,从x和y两坐标也可以计算出极坐标。要满足x不等于0等

坐标轴度量
坐标系指定了可视化的维度,而坐标轴的度量则指定了再每一个维度里数据映射的范围。坐标轴的度量有很多种,也可以用数学函数定义自己的坐标轴度量。这些坐标轴度量主要分为三种,包括数字(侧重数据的对数变化)、分类坐标轴度量和时间坐标轴度量。其中,数字坐标轴度量包括线性坐标轴度量、对数坐标轴度量、百分比坐标轴度量三类,而分类坐标轴度量包括分类坐标轴度量和顺序坐标轴度量两类。
图片来源:R语言可视化实战
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)数据有指数增长或幂定律的特性时,使用对数尺度可以将曲线变为直线表示。
下图就是这两种度量的差异:
图片来源:R语言数据可视化之美

#线性尺度
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列数据,从图中很容易观察到那亮度变量的相关性最好。
图片来源:R语言数据可视化之美
注:
(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))

图片来源:R语言可视化之美

主体系统
主体系统包括绘图区背景、网格线、坐标轴线条等图表的细节部分,而图表风格主要是指绘图区被禁、网格线、坐标轴线条等的格式设定所展现的效果。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位置调整参数如下图所示:
图片来源:R语言可视化之美
在柱形图和条形图系列中,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语言诗句可视化之美

新手工具

对于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))

图片来源:R语言可视化之美
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语言数据可视化之美

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

R语言-ggplot2图形语法 的相关文章

  • Spring入门学习—Spring IOC

    一 什么是Spring Spring是一个轻量级的IOC DI和AOP容器的开源框架 目标 使现有技术更加易用 推进编码最佳实践 内容 IOC容器 AOP实现 数据访问支持 简化JDBC ORM框架 声明式事务 Web集成 设计理念 面向B
  • 平凡的世界

    1975年的二三月间 一个平平常常的日子 细蒙蒙的雨丝夹着一星半点的雪花 正纷纷淋淋地向大地飘洒着 时令已快到惊蛰 雪当然再不会存留 往往还没等落地 就已经消失得无影无踪了 黄土高原严寒而漫长的冬天 看来就要过去 但那真正温暖的春天 还远远
  • gitcode代码仓库的基本使用

    gitcode代码仓库的基本使用 一 gitcode官网简介 二 本地配置 1 安装git工具 2 配置本地git信息 3 查看git个人信息 二 创建本地仓库 1 创建本地工作区 2 将文件放入暂存区 3 将暂存区文件放入本地仓库 4 查
  • AutoML-第一章 超参数优化

    第一章 超参数优化 摘要 最近对具有许多超参数的复杂且计算成本很高的机器学习模型 例如自动化机器学习 AutoML 框架和深度神经网络 的兴趣引起了对超参数优化 HPO 的重新研究 在本章中 我们概述了 HPO 最主要的方法 我们首先讨论基
  • LinkedList 对比 ArrayList 的区别

    LinkedList 底层是双向链表 基于双向链表 无需连续内存 随机访问慢 要沿着链表遍历 头尾插入删除性能高 占用内存多 ArrayList 底层是数组 5 基于数组 需要连续内存 6 随机访问快 指根据下标访问 7 尾部插入 删除性能
  • 为什么32位的计算机内存最多4G

    1 计算机的最小存储单元 bit 位 一个bit用于存放一个二进制数 内存的单位 Byte 一个Byte 8bit 2 计算机会给每一个单位的内存 1Byte 分配一个地址 CPU是通过内存地址来调用内存中的数据的 调用方式是直接寻址 直接
  • ResNet50 结构

    ResNet有2个基本的block 一个是Identity Block 输入和输出的dimension是一样的 所以可以串联多个 另外一个基本block是Conv Block 输入和输出的dimension是不一样的 所以不能连续串联 它的
  • centos7 无法启动网络(systemctl start network.service )错误解决办法

    大家安装Centos7 系统后 可能会出现 网卡无法自动启动 需要在图形界面点击有线链接 才能正常上网 在这里就简单说下NetworkManager service 和network service的区别 前者是图像化管理网络连接的网络服务
  • SpringBoot定时任务设置

    1 主启动类加上注解 开启定时任务 EnableScheduling 2 创建定时任务类 import org springframework beans factory annotation Autowired import org sp
  • GAN的编写 - tensorflow形式(tensorflow与GAN同学习,重点分析训练过程)

    20200901 本文完成于20200902下午 前面内容还算整洁 越到后面因为都是自己思考的过程 就导致文章越来越乱 就算是把自己思考的过程给记录下来吧 0 引言 之前的时候对keras框架编写的GAN网络进行了介绍 GAN的学习 训练过
  • 基于控制的角度无人机集群——目标追踪

    无人机集群 目标追踪 前言 一 轨迹预测 二 单目标追踪 三 多目标追踪 前言 关于目标追踪问题 有一些研究是从视觉的角度展开 而我研究的是基于控制的角度 关于多无人机集群的一些知识点 已经在上一篇文章有了简单介绍 这次我想着重介绍一下 目
  • 4.抽样分布的概念与Python实现抽样

    1 总体与样本 在实际中 总体的分布一般是未知的 或只知道它具有某种形式而其中包含着未知参数 这时 常用的办法就是根据样本来推断总体 总体 个体 样本 总体 通常把研究对象的全体称为总体 一个总体对应于一个随机变量X 个体 把组成总体的每个
  • CTFshow 信息收集 web 6 7 8 9 10

    目录 第六关 提示 flag 第七关 提示 知识点 flag 第八关 提示 知识点 flag 第九关 提示 知识点 flag 第十关 提示 flag 第六关 提示 解压源码到当前目录 测试正常 收工 这道题考的是备份文件www zip 根据
  • 解决mysql占用IO过高

    created 2023 01 30T10 14 00 UTC 08 00 tags source https www bbsmax com A Ae5RyA0AJQ author 解决mysql占用IO过高 Excerpt 1 日志产生的
  • 西门子HMI设备与V20变频器如何实现通讯?

    通常情况下 要实现HMI设备与V20变频器的通讯 需要一个支持USS通讯或MODBUS通讯的PLC 比如S7 200系列PLC 其通讯电缆连接如图1所示 PLC的一个通讯端口与触摸屏连接 可以采用PPI协议通讯 PLC的另一个通讯端口与V2
  • C语言自定义类型-结构体

    一 结构体声明 C语言中为我们准备了许多现成的数据类型例如 int short float double char long long long 等等 但是我们描述一些复杂的事物 光靠上述的数据类型是描述不清的 例如 我们描述一个大学生 可
  • 安卓Android_手机安装burp的https_CA证书

    安卓Android 手机安装burp的https CA证书 文章目录 安卓Android 手机安装burp的https CA证书 1 打卡电脑wif热点 手机连上电脑的热点 2 burp点击 Proxy settings 3 点击add 新

随机推荐

  • java 数组中插入元素_Java数组添加元素

    java 数组中插入元素 How to add elements to an array in java We know that java array size is fixed so we can t add elements to a
  • jvm虚拟机所有垃圾回收器详细介绍

    jvm虚拟机所有垃圾回收器详细介绍 文章目录 jvm虚拟机所有垃圾回收器详细介绍 垃圾回收器概述 1 Serial回收器 串行回收 总结 2 ParNew回收器 并行回收 3 Parallel Scavenge回收器 吞吐量优先 4 CMS
  • 论文解读 《Enhancing Underwater Imagery using Generative Adversarial Networks》ICRA2018

    项目 http irvlab cs umn edu enhancing underwater imagery using gans 论文 https arxiv org pdf 1801 04011 pdf 代码 https github
  • 算法精解_C语言 链表_单链表(接口定义+类型实现)

    链表可以说是一种最为基础的数据结构 链表由一组元素以一种特定的顺序组合或链接而成 在维护数据的集合时很有用 这一点同我们常用的数组很相似 然而 链表在很多情况下比数组更有优势 特别是在执行插入和删除操作时链表拥有更高的效率 链表需要动态的开
  • 组件化依赖管理办法

    theme channing cyan 在组件化过程中 面临着非常多的复用 切换等场景 对于组件化中的dsl文件 也可以尝试将其组件出来 更好的复用 更好的管理 一 利用buildSrc buildscript 对dsl 文件进行组件化 1
  • org.postgresql.util.PSQLException: 错误: 关系 “courseinformation“ 不存在

    问题描述 在java项目中连接PSQL数据库 对courseinformation表进行操作时 运行报错 org postgresql util PSQLException 错误 关系 courseinformation 不存在 已知解决方
  • BUUCTF系列 // [极客大挑战 2019] LoveSQL

    前言 本题知识点 SQL注入 WP 这题居然是个连续剧 首先尝试使用上一题的解法绕过看看 上一题 WP 的 传送门 结果如下 注意到密码有些奇怪 尝试着用 MD5 解码失败 也没啥思路 最后事实证明确实也用不到这玩意 故回到 SQL 注入上
  • 人工智能数学基础8:两个重要极限及夹逼定理

    点此跳转到老猿Python博文目录 一 极限公式1 二 极限公式2 e为常数2 71828 变体 使用案例 三 夹逼定理 夹逼定理英文原名Squeeze Theorem 也称两边夹定理 夹逼准则 夹挤定理 挟挤定理 三明治定理 是判定极限存
  • JAVA程序设计:最短回文串(LeetCode:214)

    给定一个字符串 s 你可以通过在字符串前面添加字符将其转换为回文串 找到并返回可以用这种方式转换的最短回文串 示例 1 输入 aacecaaa 输出 aaacecaaa 示例 2 输入 abcd 输出 dcbabcd 思路 这题O N 2
  • python-selenium-运行js代码--下拉操作

    使用python selenium运行js代码完成下拉操作 在某些情况 当我们下拉到浏览器 浏览器才会给我们加载数据 所有我们需要js带代码 driver execute script 写入你要执行的js代码 下拉的js代码 documen
  • 什么是CRUD( What is CRUD)?

    在很多技术性的文章 特别是有关数据库类的文章中 经常会看到一个缩写 CRUD 那什么是CRUD呢 CRUD其实是数据库基本操作中的Create 创建 ReadRetrieve 读取 Update 更新 Delete 删除 而这里的Creat
  • pycharm中pygame模块的安装与用法

    一 pygame的安装 本文章主要展示pycharm中的pygame模块的安装 打开pycharm 在左上角点file 找到settings 如图 进入后 找到Project untitled下的Project interperter 右边
  • 谷歌VAD静音检测py-webrtcvad使用详解

    一 前言 不知道有没有人和我一样看的官方示例一脸蒙 什么采样率除以时间 看到就头大 还是英文头更大了 好了废话结束 上翻译改编版 二 人话翻译版代码 如果你问我有些行为什么没有注释 import collections import con
  • 小记stm32实现串口接收的四种方法(hal库)

    开发环境 STM32CUBMX 正点原子STM32F407ZGT6探索者开发板 MDK ARM 5 31 第一种方式 直接接收 配置外部时钟源 2 配置时钟树 3 配置串口一 生产代码后进入工程 重定向printf到串口1 建议在usart
  • 攻防世界(pwn)Recho(XCTF 3rd-RCTF-2017) writeup

    64位程序 保护如上 可以分析出程序大意 先读取字符串长度存入nptr与v7中 如果字符串长度小于15时将v7设为16 大于15则不变 然后读取v7个字符放入buf中 最后在末尾添上0并打印出来 漏洞很显然 如果v7很大 则read会造成溢
  • ChatGPT实战:创业咨询,少走弯路,少踩坑

    用九死一生形容创业再适合不过 不过一旦成功回报也很诱人 这也是为什么那么多人下场创业 纸上得来终觉浅 绝知此事要躬行 创过业的人都知道其中的心酸 而他们也建议你去创业 因为那真不是一般人能干的事 又想创业 又想少踩坑 创业者肯定是想多向走过
  • Matlab中的FCM算法代码及中文详解

    Matlab中的FCM算法代码及中文详解 转自 http xiaozu renren com xiaozu 106512 336681453 function center U obj fcn FCMClust data cluster n
  • 实习僧-竞品分析报告

    找工作是应届毕业生们绕不开的话题 本文从PEST分析 行业概况 用户体验等角度 做了一份实习僧vs前程无忧的竞品分析报告 一 报告概述 1 体验环境 产品体验 软件版本 实习僧 4 14 0 前程无忧学生版1 2 0 手机系统 Harmon
  • cadence OrCAD原理图输出-pdf文件和bom表

    软件版本 16 6 一 输出pdf文件 生成pdf文件前 需要首先安装好pdf虚拟打印机 在打印时选择pdf打印机即可 在项目管理中 选择dsn文件 主菜单file gt print 选项 出现打印机对话框 默认 scale to pape
  • R语言-ggplot2图形语法

    简介 在R里 主要有两大底层图层系统 一是base图形系统 二是gird图形系统 lattice包与ggplot2包正是基于gird图形系统构建的 他们都有自己独特的图形语法 ggplot2有着自己独特的图形语法 这套语法归纳起来包括 数据