条件变量
lattice图形的一个最强大之处便是可以添加条件变量。若添加一个条件变量,每个水平下都会创建一个面板。若添加两个条件变量,则会根据两个变量各个水平的组合分别创建面板。通常,没有必要添加两个以上的条件变量。
通常,条件变量是因子。但是,如果想以连续型变量为条件,该怎么办呢?一种方法是利用R语言的cut()函数将连续型变量转换为离散变量。另外,lattice包提供了一些将连续型变量转化为瓦块(shingle)数据结构的函数。特别地,连续型变量会被分割到一系列(可能)重叠的数值范围中。如函数:
myshingle <- equal.count(x, number=#, overlap=proportion)
将会把连续型变量x分割到#区间中,重叠度为proportion,每个数值范围内的观测数相等,并返回为一个变量myshingle(或类shingle)。输出或者绘制该对象(如plot(myshingle))将会展示瓦块区间。
一旦一个连续型变量被转换为一个瓦块,我们便可以将它作为一个条件变量使用。例如,用mtcars数据集来探究以发动机排量为条件时,每加仑英里数和车重的关系。由于发动机排量是一个连续型变量,首先需要将其转为一个三水平的瓦块变量:
displacement <- equal.count(mtcars$disp, number=3, overlap=0)
然后,在xyplot()函数中使用该变量:
xyplot(mpg~wt|displacement,data = mtcars,
main="Miles per Gallon vs. Weight by Engine",
xlab = "Weight", ylab = "Miles per Gallon",
layout = c(3,1), aspect = 1.5)
上图是以发动机排量为条件时加仑英里数与车重的栅栏图。由于发动机排量是一个连续型变量,因此将其转化为三个非重叠的、内部观测数相等呢个的瓦块。这里我们使用了选项来修改面板的布局(三列和一行)和宽高比,这样更方便对三组进行比较。
面板函数
每个高级绘图函数都调用了一个默认的函数来绘制面板。这些默认的函数服从如下命名惯例:panel.graph_function,其中graph_function是该水平绘图函数。如:
xyplot(mpg~wt|displacement, data=mtcars)
也可以写成:
xyplot(mpg~wt|displacement, data=mtcars, panel=panel.xyplot)
这是一个非常强大的功能,因为它使我们可以使用自定义函数替换成默认的面板函数。我们也可以将lattice包中50多个默认面板函数中的某个或多个整合到自定义的函数中。自定义的面板函数具有极大的灵活性,我们可以随意设计输出结果以满足要求。比如,我们绘制了以发送机排量为条件时汽油英里数与车重的散点图。若想添加回归线、轴须线和网格线该怎么办呢?此时我们便可以创建自己的面板函数:
displacement <- equal.count(mtcars$disp, number=3, overlap=0)
mypanel <- function(x,y){
panel.xyplot(x,y,pch = 19)
panel.rug(x,y)
panel.grid(h=-1,v=-1)
panel.lmline(x,y,col="red",lwd=1,lty=2)
}
xyplot(mpg~wt|displacement,data = mtcars,
layout = c(3,1),
aspect = 1.5,
main="Miles per Gallon vs. Weight by Engine Displacement",
xlab = "Weight", ylab = "Miles per Gallon",
panel = mypanel)
上图以发动机排量为条件时每加仑英里数与车重的栅栏图。这里我们使用了面板函数添加了回归线、轴须线和网格线。
这里我们将四个独立的绘制函数整合到自己的自己的mypanel()函数中,然后通过xyplot()函数中panel选项将其显示出来。panel.xyplot()函数生成了填充圆圈(pch=19)的散点图。panel.rug()函数在每个面板的x轴和y轴上添加了轴须线。panel.rug(x,FALSE)或panel.rug(FALSE,y)将分别只对横轴或纵轴添加轴须。panel.grid()函数添加了水平和竖直的网格线(使用负数强制它们与轴标签对齐)。最后,panel.lmline()函数添加了一条红色的(col="red")、标准粗细(lwd=1)的虚线(lty=2)回归线。每个默认的面板函数都有自己的结构和选项。
第二个例子,我们绘制以汽车传动类型为条件时每加仑英里数与发动机排量(连续型变量)的关系图。除了创建单独的自排和手排发动机的面板,我们还将添加平滑拟合曲线和水平均值线:
mtcars$transmission <- factor(mtcars$am, levels = c(0,1),
labels = c("Automatic","Manual"))
panel.smoother <- function(x,y){
panel.grid(h=-1,v=-1)
panel.xyplot(x,y)
panel.loess(x,y)
panel.abline(h=mean(y),lwd = 2,lty = 2,col = "green")
}
xyplot(mpg~disp|transmission,data = mtcars,
scales = list(cex=.8,col="red"),
layout = c(2,1),
panel = panel.smoother,
xlab = "Displacement", ylab = "Miles per Gallon",
main="MGP vs Displacement by Transmission Type",
sub="Dotted lines are Group Means", aspect = 1)
panel.xyplot()函数绘制了各个点,panel.loess()函数在每个面板中绘制了非参拟合曲线。panel.abline()函数在条件变量的各个水平下添加了mpg的均值线。若用h=mean(mtcars$mpg)替换h=mean(y),那么将只绘制整个样本集的一个mpg均值参考线。scales选项将标度的标注修改为红色和80%的默认大小。在这个例子中,我们也可以使用scales=list(x=list(), y=list())来分别设定横轴和纵轴的选项。