《ggplot2:数据分析与图形艺术》
第4章 用图形构建图像
4.5 图形属性映射
4.5.3 分组
几何对象可以大致的氛围个体几何对象和群组几何对象两类,个体几何对象对数据框的每一条数据绘制一个可以区别其他个体的图形对象。群组几何对象用来表示多条观测。
默认的,离散型变量的交互作用被设为分组的默认值,如果没能正确分组或者没有俩三星变量,就需要自定义分组结构。即将group映射到一个在不同的组有不同取值的变量。当现有的单个变量不能够正确地分组,而两个变量的组合可以正确分组时,可以使用interaction()函数。
通常有三种情况时默认分组不能解决的:
1,多个分组与单个图形属性
> install.packages('nlme')#选择LanZhou镜像> library(ggplot2)> library(nlme)#方便导入Oxboys数据集
很多时候,我们都想将数据分成若干组,并用相同的方式对每个组进行渲染。当从总体上来查看数据时,我们通常希望区分每个个体而不是识别它们。这在含有多个个体的纵向数据中是很常见的,而这类图形也场被称为“细面图”。> p <- ggplot(Oxboys, aes(age, height, group=Subject))+geom_line()> print(p)> ggplot(Oxboys, aes(age, height))+geom_line()
第一张图,正确分组时(分组变量group=Subject)每个个体为一个独立的折线图。第二张图,错误分组时(没有group=Subject)图形时连接所有观测点的折线图,分组效果等同于group=1。
我们指定Subject为分组变量,每个男孩对应一条线。如果没有指定分组变量,我们得到了一条通过每一个点的单一线条,则图形毫无用处。
2,不同图层上的不同分组
有时我们想根据不同水平下的数据整合来对统计汇总信息进行图形绘制,从而不同的图层可能有不同的分组图形属性,因此,有点图层展示个体水平的数据,而有的图层则展示更大组群的统计信息。
在前面例子的基础上,假设我们想根据所有男孩的年龄和身高在图中添加一条光滑线条。如果还用和前面绘制折线图时同样的分子方式,将会得到下面的图。> p+geom_smooth(aes(group=Subject), method="lm", se=F)
事实上我们不需要对每条折线,即不需要对每个男孩添加一条光滑曲线;所以新图层需要一个不同的分组图形属性,group=1,这样所绘出的线条(smooth)才是基于整体数据的。> p+geom_smooth(aes(group=1), method="lm", se=F)#这个group=1是第二个图形的分组定义,即geom_smooth的图层中的内容。
这张图在平滑层里用到了aes(group=1),得到了所有男孩的拟合直线。
3,修改默认分组
如果图像中含有离散型变量,而你却想绘制连接所有分组的线条,那么你可以采取绘制交互作用图、轮廓图以及平行坐标图时所用的策略。这里以绘制各个测量时期(Occasion)身高(height)的箱线图为例。> boysbox <- ggplot(Oxboys, aes(Occasion, height))+geom_boxplot()#Occasion是箱线图的分组,数值从1到9,height是箱线图的数值,作为每个组绘制图形的数值,subset(Oxboys, Oxboys$Occasion==9)可查看Occasion值为9的各个数值。> print(boysbox)
这样是只画一个分组(Occasion==9)的箱线图。> O9=subset(Oxboys, Oxboys$Occasion==9);> ggplot(O9, aes(Occasion, height))+geom_boxplot()
这里没有必要设定组图形属性;因为Occasion是一个离散型变量,所以默认的分组变量就是Occasion。要在此基础上添加个体轨迹,我们需要用aes(group=Subject)修改第一层的默认分组。> boysbox + geom_line(aes(group=Subject), colour="#3366FF")
如果想用geom_line()添加每个男孩的轨迹,就需要在新图形里面设定aes(group=Subject)。boysbox + geom_line(aes(group=Oxboys$Subject), colour=I("red"));group=Oxboys$Subject这种显示分组数值的方法也需更实用。