使用ggplot2进行高级绘图
除了基础图形,grid、lattice和ggplot2软件包也提供了图形系统,它们克服了R基础图形系统的低效性,大大扩展了R的绘图能力。
grid图形系统可以很容易地控制图形基础单元,给予编程者创作图形的极大灵活性。
lattice包通过一维、二维或三维条件绘图,即所谓的网格图形(trellis graph)来对多元变量关系进行直观展示。
ggplot2包则基于一种全面的图形“语法”,提供了一种全新的图形创建方法。
1 R 中的四种图形系统
R中有四种主要的图形系统。
基础图形系统由Ross Ihaka编写,每个R都默认安装,之前的大部分图形都是依赖于基础图形函数创建的。
grid图形提供了一种比标准图形系统更低水平的方法。用户可以在图形设备上随意创建矩形区域,在该区域定义坐标系统,然后使用一系列丰富的绘图基础单元来控制图形元素的摆放和外观。grid图形的灵活性对于软件开发者是非常有价值的,但是grid包没有提供生成统计图形以及完整绘图的函数。因此,数据分析师很少直接采用grid包来分析数据。
lattice包由Deepayan Sarkar(2008)编写,可绘制Cleveland(1985,1993)所描述的网格图形。总的来说,网格图形显示一个变量的分布或是变量之间的关系,分别显示一个或多个变量的各个水平。lattice包基于grid包创建,在多元数据的可视化功能方面已经远超Cleveland的原始方法。它为R提供了一种全面的、创建统计图形的备选系统。
ggplot2包的目标是提供一个全面的、基于语法的、连贯一致的图形生成系统,允许用户创建新颖的、有创新性的数据可视化图形。该方法的力量已经使得ggplot2成为使用R进行数据可视化的重要工具。
2 ggplot2 包介绍
ggplot2包实现了一个在R中基于全面一致的语法创建图形时的系统。这提供了在R中画图时经常缺乏的图形创造的一致性并允许我们创建具有创新性和新颖性的图表类型。
在ggplot2中,图是采用串联起来(+)号函数创建的。每个函数修改属于自己的部分。下面给出了一个最简单的例子:
ggplot(data=mtcars, aes(x=wt, y=mpg)) +
geom_point() +
labs(title="Automobile Data", x="Weight", y="Miles Per Gallon")
结果分析:ggplot()初始化图形并且指定要用到的数据来源(mtcars)和变量(wt、mpg)。aes()函数的功能是指定每个变量扮演的角色(aes代表aesthetics,即如何用视觉形式呈现信息)。在这里,变量wt的值映射到沿x轴的距离,变量mpg的值映射到沿y轴的距离。ggplot()函数设置图形但没有自己的视觉输出。使用一个或多个几何函数向图中添加了几何对象(简写为geom),包括点、线、条、箱线图和阴影区域。在这个例子中,geom_point()函数在图形中画点,创建了一个散点图。
在ggplot2中有很多的函数,并且大多数包含可选的参数。扩展一下前面的例子,代码如下:
library(ggplot2)
ggplot(data=mtcars, aes(x=wt, y=mpg)) +
geom_point(pch=17, color="blue", size=2) +
geom_smooth(method="lm", color="red", linetype=2) +
labs(title="Automobile Data", x="Weight", y="Miles Per Gallon")
结果分析:选用geom_point()函数来设置点的形状为三角形(pch=17),点的大小加倍(size=2),并使颜色为蓝色(color="blue")。geom_smooth()函数增加了一条“平滑”曲线。这里需要线性拟合(method="lm"),并且产生一条红色(color="red")虚线(linetype=2),线条尺寸为1(size=1)。默认情况下,平滑的曲线包括在95%的置信区间(较暗带)内。
ggplot2包提供了分组和小面化(faceting)的方法。分组指的是在一个图形中显示两组或多组观察结果。小面化指的是在单独、并排的图形上显示观察组。ggplot2包在定义组或面时使用因子。
我们可以使用mtcars数据集来查看分组和面。首先,将am、vs和cyl变量转化为因子:
mtcars$am <- factor(mtcars$am, levels=c(0,1),
labels=c("Automatic", "Manual"))
mtcars$vs <- factor(mtcars$vs, levels=c(0,1),
labels=c("V-Engine", "Straight Engine"))
mtcars$cyl <- factor(mtcars$cyl)
接下来,利用下面的代码绘图:
library(ggplot2)
ggplot(data=mtcars, aes(x=hp, y=mpg,
shape=cyl, color=cyl)) +
geom_point(size=3) +
facet_grid(am~vs) +
labs(title="Automobile Data by Engine Type",
x="Horsepower", y="Miles Per Gallon")
结果分析:效果图包含变速箱类型am(自动Automatic对手动Manual)和发动机装置(V型发动机V-Engine 与直列式发动机Straight Engine)每个组合的分离的散点图。每个点的颜色和形状表示该汽车发动机汽缸cyl的数量。在本例中,am和vs是刻面变量,cyl是分组变量。