上次我们学习了lattice的基本知识,看看这些图,你记起来了吗?
我们接下来看看如何调节它们的变量,我们知道,lattice绘图的一个强大特征是可以增加调节变量。
如果存在一个调节变量,就可以绘制出对应每个水平的面板图。如果存在调节变量,就可以绘制出给定两个变量每个水平的任意组合的面板图。
通常情况下,调节变量是因子。
但是对于连续的变量应该如何操作呢?
- 一种方法是使用R的cut()函数将连续的变量转化为离散的变量。
- 另一种方法是,lattice包提供的函数将连续的变量分成一系列重叠的范围。
- 例如:
myshingle<-equal.count(x,number=n,overlap=proportion)
将连续的变量x分成n个间隔,重叠比例proportion,每个间隔里的观测值个数相同,并将其返回为变量myshingle。
一旦变量转化为shingle,就可以使用它来作为一个调节变量。
下面我们来看个例子。
我们使用mtcars数据集来探索汽车每加仑汽油的行驶英里数与以发动机排量为条件的汽车重量之间的关系。因为发动机排量是一个连续的变量,所以首先把它转化为三水平的shingle变量:
install.packages("lattice") library(lattice) displacement <- equal.count(mtcars$disp,number=3,overlap=0)
把变量应用到xyplot()函数中,
xyplot(mpg~wt|displacement,data=mtcars, main="Miles Per Gallon vs. Weight by Englishi Displacement", xlab="Weight",ylab="Miles Per Gallon",layout=c(3,1),aspect=2)
我们在这段代码里用了选项来调整面板的布局和纵横比,来看一下结果。
怎么样?是不是比较简单,接下来我们来看一下面板函数。
前面我们画出了以汽车发动机排量为条件的汽车重量的油耗。
那如果我们想加上回归线、地毯图和网格线,我们怎么做呢?
其实,我们可以通过创建自己的面板函数来实现它。
一起来看一看。
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 Englishi Displacement", xlab="Weight",ylab="Miles Per Gallon",panel=mypanel)
这里我们将四个独立的构件函数集成到自己的mypanel()函数中,并通过xyplot()函数中的panel=option选项使它生效;
panel.xyplot()函数使用一个填充的圆产生散点图;
panel.rug()函数把地毯图加到x轴和y轴的每个标签上;
panel.grid()函数添加水平和垂直的网格线,使用负数迫使其用轴标签排队;
最后用panel.lmline()函数添加了被渲染成红色、标准厚度的虚线的回归曲线。
来看看有什么变化吧。
我们如果想添加拟合曲线和水平均值曲线,代码如下:
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="darkgreen") } xyplot(mpg~disp|transmission,data=mtcars, scales=list(cex=0.8,col="red"), panel=panel.smoother, xlab="Displacement",ylab="Miles per Gallon", main="MPG vs Displacement by Transmission Type", sub="Dotted lines are Group Means",aspect=1)
在上面的代码中,panel.xyplot()函数画出了个别点;
panel.loess()函数在每个面板图中画出了非参数拟合曲线;
Panel.abline()函数在调解变量的每个水平中添加了水平参考线;
scales=选项呈现大小为默认字体80%的红色刻度注释。
大家动动手,去揭示它的神秘面纱吧。
好了,今天就结束了,下次我们一起来学习如何从观测值的组中添加数据,而不是用单独的面板图呈现出来。下次见喽。