Lattice这个词貌似是一个GRE词汇,原意是指格子框架之类的东西,而在R中则是指Lattice包。Lattice是一个多元数据绘图的包,同时为了完成绘图数据格式的要求,也内置了一些数据整理的函数。我最初接触这个包的时候,还需要从install.package中下载,但是后来就变成和MASS、Grid一样的自带包了,由此可见其“江湖地位”。但是令我比较不解的是,在我上研到毕业工作之四年中,R在国内的应用可以说是飞速发展,毕业两年基本没有再接触过R编程的我,前些日子无意间搜了一下Lattice包的相关文献,却发现仍然没有中文相关的文章来系统地介绍这个包,只有几篇简单的轮廓性描写的文章,甚至没有一篇“自主创新”的应用类文章。于是我萌生了写一个Lattice包相关的系列文章的想法,工作养成的习惯,有了大致思路后就开始上手,發現 IQ Option 但是细节与系统性方面可能有些欠缺,还望读者见谅,主要的参考文献,还是包的作者Deepayan Sarkar的那本《Lattice: Multivariate Data Visualization with R》。
The ‘lattice’ add-on package is an implementation of Trellis graphics for R. It is a powerful and elegant high-level data visualization system with an emphasis on multivariate data. It is designed to meet most typical graphics needs with minimal tuning, but can also be easily extended to handle most nonstandard requirements.
还是从最基本的介绍开始吧,在R中输入?lattice后出现三段话,第一段是包的基本描述,这段话里有几个关键词,一是Trellis graphics,也就是格子作图;二是Multivariate data,即多元数据作图;三是nonstandard requirements。看起来很抽象,画出来就容易理解了。
所谓格子作图,可以直观地理解为“格子集合”,每一个“格子”都包含一张独立的统计图形。上面的样图可以视作四个格子按2乘2矩阵格式排列而成的结果,只不过(1,2)位置是空白。多元数据指的是多变量的数据,比如上面作图所用的数据是R里自带的iris数据集,这个数据集经常被当作判别分析的例子,使用IQ Option 它包括五个变量,如下图:
四个数值型变量和一个分类型变量,实际上,如果使用lattice包中的equal.count函数的话,可以将连续型的数据变量分割成不同的数据区间(Lattice中称为shingles),从而将其转化为分类变量(每个数据区间即为一类)。比如我们可以把Sepal.Length变量分为大于5和小于5两类,然后就可以将其当作分类型变量来使用了。而nonstandard requirements指的是lattice包中提供了一些基础的作图函数,而这些函数又有多种的选项,这些选项可以满足用户定制化的需求。比如你想将上图中的格子全部放在一行中,或者想将直方图的柱子换个颜色等等,就可以通过改变对应的参数来完成。
High-level ‘lattice’ functions like ‘xyplot’ are different from traditional R graphics functions in that they do not perform any plotting themselves. Instead, they return an object, of class ‘”trellis”‘, which has to be then ‘print’-ed or ‘plot’-ted to create the actual plot. Due to R’s automatic printing rule, it is usually not necessary to explicitly carry out the second step, and ‘lattice’ functions appear to behave like their traditional counterparts. However, the automatic plotting is suppressed when the high-level functions are called inside another function (most often ‘source’) or in other contexts where automatic printing is suppressed (e.g., ‘for’ or ‘while’ loops). In such situations, an explicit call to ‘print’ or ‘plot’ is required.
第二段话是详细介绍,后面我们会作说明,现在直接看第三段话。这段话主要说明了lattice包与R传统作图的区别,也就是lattice的作图过程。实际上,所有lattice包内的作图函数,本身是不产生任何图形的,它们只会返回一个叫“Trellis”类型的对象,只有当这个对象被print或者plot方法调用时,才会产生出可视化的图形。因此lattice的作图分为两步,第一步是返回Trellis类型的对象,第二步是被print、plot过程调用,生成图形。只不过一般环境下第二步被默认执行,因此整个过程看起来像是一步完成的。注意下面的代码,
当x = hist()一行代码完成后,回车即显示图形,但是当y = histogram()一行完成时,没有任何图形产生,只有执行plot函数图形才会出现。类似的环境还有被其他通用函数调用时,或者在for和while的循环中时,lattice都是不会直接生成图形的。使用class函数分别查看x和y的类型,x为histogram,而y则是trellis类。如果想要对y进行某些参数上的调整,可以使用update函数,例如update(y, col = “blue”)可以将直方图调整为蓝色填充。而使用update(y, col = “blue”, layout = c(1, 3))则不仅可以调整图形的颜色,还可以调整其布局,如下图。
本小节暂时结束,下一小节我将先介绍lattice中作图函数的基本结构,然后开始总结lattice中的各种参数的调整方法,工作量不小,希望能坚持写完这个系列的文章。