写在前面
今天准备开一个新的系列,之前写过一个R语言基础的系列推文,一共包括49篇推文,早期的推文主要是介绍R语言的基础知识,后面的推文大多是基于base的绘图方法和一些解决专门问题的R包。
不过我想大部分人现在使用R都应该是利用ggplot2来进行图形的可视化,除非是特殊情况,不然base应该是很少会用了,我自己之前的微生物群落分析系列推文中也基本都是使用ggplot2来绘制结果图。
虽然说的是“从0开始”,但是我建议纯新手还是先去看看我之前的R语言基础系列推文,至少要知道R包是怎么回事、R的数据结构是什么样的、数据怎样输入到R环境、R语言的基础绘图参数比如颜色、形状等等是什么样的概念。
整个系列应该会持续比较长的时间,虽然面向的是新手,但是我觉得各位“老手”也有必要浏览一下,我觉得我这里大部分人应该都是从实践出来自己慢慢摸索的野路子,其实都没有经过什么系统的学习,最后其实就是能把图画出来,但是对于一些细节和理论问题其实并不十分清楚。我自己也是一样,写这个系列的一个目的其实也是对我自己的一个查缺补漏和梳理的过程。
本系列教程中很多基本理论的介绍会参考《ggplot2:数据分析与图形艺术》一书,这也是学习ggplot2最经典的教材了,网上很容易找到这本书,大家可以自行去找一本看一看。
这个系列推文会与宏基因组分析系列推文交叉更新,其实也是因为宏基因组的推文每一篇写起来都是非常的耗费精力,一周想写好几篇不太现实,ggplot2的推文相对容易一些,长短都是看我心情,要不然真变成周更怪大家估计就把我忘了?
ggplot2
ggplot2的成功依赖于其具有的一整套完备的语法体系,一个完整的ggplot绘图代码本质上其实就是一个组合的过程,理论上ggplot2可能实现任何情况的图像绘制,可以说是只有想不到,没有做不到。
所以说要想真正的用好ggplot2,那么我们就必须花时间去系统的理解其背后的整个语法体系。
随着ggplot2使用的越来越广泛,现在出现了一大批基于ggplot2的扩展包,都号称自己有多么强大的功能,但其实我觉得这其中大部分的扩展包其余与ggplot2是背道而驰的。
我并不否认,这些扩展包能够让你在不需要了解全部ggplot2语法的情况下画出来一个图,但是由于大部分扩展包开发水平的限制,基本上代码都是写死的,也就是说你只能按照作者给你画的框架来做,本质上已经失去了ggplot2自由绘图的核心。
那么最终你肯定要做出一个妥协,有些你想要修改的参数就是没办法修改。
其实这一问题只需要花一些时间把ggplot2的基本语法体系了解清楚,那么扩展包能实现的功能自己使用ggplot2也是能够实现的,并且还可以根据自己的想法进行任意更改。
所以我真的希望在我整个的系列推文写完之后,能有一部人从0开始自己就能够写出一个完整的绘图代码,至少也要知道别人的代码自己需要修改哪些位置才能满足自身的要求。
ggplot2的基本组成部分
ggplot是基于图层概念进行绘图的,简单的说就是将数据根据图形属性和统计变换映射到几何对象上,之后将其绘制在一个坐标系中的过程。
一张ggplot图形包括一下组成部分:
数据 (data):
用于绘图的数据;
映射 (mapping):
将数据与图形属性 (aesthetic attributes) 建立对应关系,使用aes函数完成;
图层 (layers):
包括几何对象 (geometric object,geom)、统计变换 (statistical transformation,stats)、和位置 (position);
坐标系 (coordinate system):
描述了数据是如何映射到图形所在的平面的,它同时提供了看图所需的坐标轴和网格线。
我们通常使用的是笛卡尔坐标系,但也可以将其变换为其它类型,如极坐标和地图投影;
标度 (scale):
将数据的取值映射到图形空间,例如用颜色、大小或形状来表示不同的取值。
展现标度的常见做法是绘制图例和坐标轴——它们实际上是从图形到数据的一个映射,使你可以从图形中读取原始的数据。
标度包括位置、颜色、大小、形状、线型。
主题 (theme):
标题文字(字体、字号、颜色)、图形边框和底纹等跟数据无关的一些图形元素的设置都可以归到“主题”这一类。
分面 (facet):
指定绘图窗口划分为若干个子窗口,用于绘制一页多图。
映射 (mapping)
ggplot是ggplot2绘图的主函数,在其内部定义绘图数据和映射。
下面的代码是一个ggplot2绘图的最基本代码,其包含3个部分,数据、映射和几何对象。
ggplot(data,aes(x = X, y = Y)) + geom_point()
要想使用ggplot绘图就必须现在ggplot函数中使用aes对数据进行映射,在aes中必须要制定与坐标轴匹配的映射。
此外,ggplot2按照图形属性提供了以下可用映射类型:
颜色类型映射:
包括 color(颜色或边框颜色)、fill(填充颜色)和 alpha(透明度);
形状类型映射:
包括 linetype(线型)、size(点的大小或线的宽度)和 shape(形状);
位置类型映射:
包括 x, y, xmin, xmax, ymin, ymax, xend, yend;
特殊类型:
包括两类,一类是指定数据分组和顺序的映射group和order,另一类是字符串映射。
这里要注意字符串映射,其他类型的映射都可以用aes函数指定,字符串映射需要使用专门的函数aes_string。
除了通过映射设置几何图形的图形颜色和形状属性外,ggplot2还提供了直接设定方式,就是不在aes内进行映射,而是在aes括号外部或者在几何对象的函数内进行设置。
和映射方式设置不一样的是,直接设定方式不会在图例上有反映。
ggplot2按“层”做图,我们可以同时将映射匹配到多个几何对象上,所以图层的顺序对于图形的表现会有影响,如果几何对象有叠加,那么后面图层的对象会覆盖前面图层的对象。
附赠一个之前从小明那里获得的aes和几何对象影射的对照表。
![e72b04c33b6e58f4f3141546dc382e53.png](https://img-blog.csdnimg.cn/img_convert/e72b04c33b6e58f4f3141546dc382e53.png)