正在加载
请稍等

菜单

Home 码农菜园 数据分析 R学习笔记-10 高级图形进阶
Home 码农菜园 数据分析 R学习笔记-10 高级图形进阶

R学习笔记-10 高级图形进阶

数据分析 by   阅读量 8,664

除了R中的基础图形之外,grid、lattice和ggplot2等软件包也提供了图形系统,它们克服了R基础图形系统的低效性,大大地扩展了R的绘图能力。

grid图形系统可以很容易地控制图形基础单元,给予编程者创作图形极大的灵活性。lattice包通过一维、二维或三维条件绘图,即所谓的栅栏(trellis)图形来对多元变量关系进行直观展示。ggplot2包则基于一种全面的图形“语法”,提供了一种全新的图形创建方法。

10.1 R中的四种图形系统

R中的四种图形系统即,基础图形系统、grid、lattice和ggplot2,基础图形无须安装和加载即可使用,grid和lattice使用前需要加载对应的包,而ggplot2还需要安装并加载。

10.2 lattice包

在一个或多个其他变量的条件下,栅栏图形展示某个变量的分布或与其他变量间的关系。以lattice包中的singer数据集为例,其包含了合唱成员的身高和声部数据,来看以下代码:

height为因变量,voice.part被称为条件变量,以上代码对八个声部的每一个都创建一个直方图,图形显示男高音和男低音比女低音和女高音身高都要高。

在栅栏图形中,单个面板要依据条件变量的各个水平来创建。如果指定了多个条件变量,那么一个面板将按照各个因子水平的组合来创建。面板将被排成一个阵列以进行比较,用户可对每个面板中展示的图形、面板的格式和位置、面板的摆放、图例的内容和位置以及其他许多图形特征进行控制。

lattice包的高级绘图都服从以下格式:

其中formula指定要展示的变量和条件变量,data指定一个数据框,options为逗号分隔参数,用来修改图形的内容、摆放方式和标注,graph_function可以是以下函数:

  • contourplot():三维等高线图;
  • levelplot():三维水平图;
  • cloud():三维散点图;
  • wireframe():三维线框图;
  • barchart():条形图;
  • bwplot():箱线图;
  • dotplot():点图:
  • histogram():直方图;
  • densityplot():核密度图;
  • parallel():平行坐标图;
  • xyplot():散点图;
  • splom():散点图矩阵;
  • stripplot():带状图。

设小写字母代表数值型变量,大写字母代表类别型变量(因子),在高级绘图函数中,表达式形式通常为:

竖线左边的变量为主要变量,右边的变量为条件变量。主要变量将变量映射到每个面板的坐标轴上。尝试运行以下代码,加深对以上表达式的理解,图形基于数据框mtcars中的小汽车数据绘制而成。

可以将lattice包高级绘图函数生成的图形存储至变量,以进一步操作和管理。

以上代码创建了一个栅栏密度图并存储在mygraph对象中。此时不会展示任何图形,只有调用plot(mygraph)或mygraph时才会展示图形。通过使用options,可以轻松地修改lattice图形,或者在图形对象生成之后使用update()函数:

条件变量

lattice图形的一个最强大之处便是可以添加条件变量,并创建和每个条件变量水平对应的图形面板。

通常,条件变量是因子。如果希望以连续型变量为条件,那么一种方法是使用R的cut()函数将连续型变量转换为离散变量,另一种方法是使用lattice包中提供的函数。lattice包提供了一些将连续型变量转化为瓦块(shingle)数据结构的函数,特别的,连续型变量会被分割到一系列(可能)重叠的数值范围中。

以上函数会把连续型变量x分割到#个区间中,重叠度为proportion,每个数值范围内观测数量相等,并返回为一个变量myshingle,输出或绘制该对象将会展示瓦块区间。

以mtcars为例,将发动机排量转化为一个三水平的瓦块变量并使用,代码还使用选项修改了面板的布局和宽高比,以便于比较。

面板函数

lattice包中的每个高级绘图函数都调用了一个默认的绘图函数来绘制面板,如以下两种形式是等价的:

你可以使用自定义函数替换默认的函数,或者将一个或多个默认函数整合至自定义函数中,这意味着面板的绘制具备了极大的灵活性。

之前的例子绘制了mtcars数据集中mpg、wt和disp等变量间关系的散点图,如果需要添加回归线、轴须线和网格线,则需要创建自己的面板函数。

自定义lattice中的panel

再来看一个例子,绘制以汽车传动类型为条件时每加仑英里数与发动机排量(连续型变量)的关系图。

分组变量

当一个lattice图形表达式含有条件变量时,将会生成在该变量各个水平下的面板。若希望将结果叠加在一起,则需要将变量设定为分组变量(grouping variable)。以下代码用核密度图展示手动档和自动挡汽车的每加仑英里数分布情况。

图例和图例符号不会默认生成,可以使用auto.key=TRUE创建一个摆放在图形上方的初步图例,或者以列表形式提供参数:

如果希望对图例进行更多控制,可使用key=选项,以下代码给出了一个示例。

最后再附上一个例子,将分组变量和条件变量同时包含在一幅图形中,使用了CO2数据集。

图形参数

以上图形参数的修改都是针对某次绘图指定的,类似之前接触的par()函数,lattice包也有更改默认绘图参数的方法,使用trellis.par.get()查看,使用trellis.par.set()设置,使用show.settings()查看当前的图形参数设置情况。思考以下代码的作用:

页面摆放

由于lattice函数不识别par()设置,所以如果希望在一个页面中摆放多个图形,最简单的方法是先将lattice图形存储到对象中,然后利用plot()函数中的split=或position=选项来进行控制。

split选项将页面分割为一个指定行数和列数的矩阵,然后将图形放置到该矩阵中。split选项格式为,split=c(placement row, placement column, total number of rows, total number of columns)。

使用position=选项可以对大小和摆放方式进行更多的控制,position选项的格式为,position=c(xmin, ymin, xmax, ymax),原点在图形左下角。

高级绘图函数的index.cond=选项可以设定变量水平的顺序,对每个条件变量指定一个顺序向量即可,例如对于之前CO2数据集的例子,增加选项index.cond=list(c(1, 2), c(2, 1))将会翻转原始的绘图顺序。

 10.3 ggplot2包

ggplot2包提供了一个基于全面而连贯的语法的绘图系统。

ggplot2中最简单的绘图方式是qplot()函数,即快速绘图函数,格式为:

其中各个参数含义如下:

  • alpha:元素重叠的透明度;
  • color、shape、size、fill:把变量的水平和符号颜色、形状或大小相关联;
  • data:指定一个数据框;
  • facets:指定条件变量,创建一个栅栏图,表达式如rowvar~colvar;
  • geom:设定定义图形类型的几何形状,包括“point”、“smooth”、“boxplot”、“line”、“histogram”、“density”、“bar”和“jitter”;
  • main、sub:标题和副标题;
  • method、formula:当geom为“smooth”时,则会默认添加一条平滑拟合曲线和置信区间。当观测数大于1000时,需要调用更高效的平滑拟合算法,method包括lm、广义可加模型gam、稳健回归rlm,formula指定拟合的形式;
  • x、y:指定摆放在水平轴和竖直轴的变量,对于单变量图形(如直方图)则省略y;
  • xlab、ylab、xlim、ylim:坐标轴标签和范围。

来一个简单的例子,以下代码创建了一个以气缸数为条件的每加仑英里数的箱线图,真实数据点都相互叠加(添加扰动以减少重叠),箱线图的颜色依据气缸数而变化。

再来一个例子,创建一个以车重为条件的每加仑英里数的散点图矩阵,利用颜色和符号形状区分自动挡和手动挡,并对每种传动类型添加各自的回归线和置信区间带。

qplot示例

第三个例子将创建一个分面图,每个分面展示了车重与每加仑英里数的散点图。传动类型定义了行分面,而气缸数则定义了列分面,数据点的大小代表了汽车马力的评分。

qplot创建的分面散点图

可以看出,利用ggplot2创建复杂的图形(实际上是一个气泡图)是多么容易。

最后,再次对一开始的singer数据进行绘图。

singer身高分布密度图

10.4 交互式图形

R的基础安装提供了有限的图形交互功能,虽然可以通过添加额外的程序代码修改图形,但是很少能通过鼠标修改图形或收集新的信息。不过R的一些包可以极大增强与图形的交互能力,如playwith、latticist、iplot和rggobi包。

标注点

R基础安装中的identify()函数可用来进行鉴别和标注散点图中的点。但遗憾的是,identify()对lattice或ggplot2图形无效。

playwith

playwith包提供了一个GTK+GUI,使得用户可以编辑R图形并与之交互,输入代码install.packages(“playwith”, depend=TRUE)即可安装。

playwith()函数允许用户识别和标注点、查看一个观测所有的变量值、缩放和旋转图形、添加标注(文本、箭头、线条、矩阵、标题和标签)、修改视觉元素(颜色、文本大小等)、应用先前存储的图形风格,以及以多种格式输出图形结果。

latticist

使用latticist包可以通过栅栏图方式探索数据集,如果有需要,latticist包还可以与playwith包整合在一起。

iplots

playwith和latticist包只能和单幅图形交互,而iplots包提供的交互则有所不同。该包提供了交互式马赛图、柱状图、箱线图、平行坐标图、散点图、直方图以及颜色刷,并可将它们结合在一起绘制。

iplots包通过Java编写实现,最好在JGR(Java GUI for R)中使用,提供了以下主要函数:

  • ibar():交互式柱状图;
  • ibox():交互式箱线图;
  • ihist():交互式直方图;
  • imap():交互式地图;
  • imosaic():交互式马赛克图;
  • ipcp():交互式平行坐标图;
  • iplot():交互式散点图。

为了更好地理解iplots的工作机理,不妨运行以下代码。

现在尝试以下步骤:

  1. 单击柱状图(gears)窗口的三号齿轮条,直条将会变成红色。另外,其他图形窗口中的所有三齿轮发动机都会被突出显示;
  2. 按住Ctrl键不动,将鼠标移动到某幅图形中点、条、箱线图或线上,该对象的详细信息将会在一个弹出窗口中显示出来;
  3. 右击任何对象,便可在右键菜单中获得一些选项;
  4. 拖动鼠标可选择不止一个对象(点、条等),或使用shift键通过单击选择不邻接的对象。

iplots包中的函数可用来探索变量分布和交互选择的观测子集中的变量关系,若用其他方式进行,将会是一件困难和耗时耗力的工作。

rggobi

GGobi是独立于R的一个开源软件,首先安装GGobi,然后在R中安装rggobi包,之后即可利用ggobi()函数在R中运行GGobi(和JGR安装使用步骤类似)。

26 2015-04

1条评论

  1. 匿名说道:

    R语言绘图 数据点的大小代表了汽车马力的评分

发表评论