用ggplot绘图(七)

facet: 另一种展示分组数据的方法

用过其他绘图库的用户可能知道一般的绘图库都会提供类似于Matlab中subplot的将一个图形分割为多个坐标轴的功能。然而前面的内容里完全没有提到ggplot可以达到这个功能,而且似乎看起来这个观念和ggplot完全不相容。因为,ggplot的目的在于将数据按照一个模型展示出来,所以不支持将多种模型的图形放置到一个图形中是很自然的。当然,用户可以将两个无关的ggplot图形放置到一个图形中,不过这个观念在ggplot中是没有必要实现的。认真的读者已经发现了,前面我说的是不支持将多种不同模型的图形,那么自然的如果描述数据的模型是一致的,是不是ggplot就支持呢?答案是确实如此。

在ggplot将这种将数据分割到不同坐标轴展示的方法和按照不同颜色,大小展示分组数据的概念等价起来了。因为用不同的坐标轴展示和用不同的标记字符,或者颜色等实际上都是将数据按照某变量分组显示,所以可以认为这只是另外一种分组展示数据的方法。在ggplot里这种展示方法被称作facet。

在ggplot默认支持三种facet方案:

第一种就是默认值,所有数据都在一个坐标轴下展示,叫做facet_null。这个不是很有意思。

qplot(carat,price,color=color,data=diamonds,
      geom='point') + geom_smooth(method='lm',size=1) +
  scale_color_brewer(palette='Set1') +
  facet_null()

第二种是facet_wrap,就是将数据按照分组变量依次排开。 有几个选项需要说明下:

facet_wrap(facets, nrow = NULL, ncol = NULL, scales = "fixed",
  shrink = TRUE, as.table = TRUE, drop = TRUE)
  
**Arguments**

facets  
一般是“~变量名”或者“~变量一+变量二”

nrow    
控制总行数

ncol    
控制总列数

scales  
这个变量控制不同图像间坐标的尺度关系。"fixed"是指多个坐标轴使用相同的尺度,这个是默认值; "free"是指根据当前坐标轴的内容确定尺度,"free_x"和"free_y"是根据x或者y的数据范围确定当前坐标轴的尺度。

as.table    
这个控制最大值的变量的位置,TURE是默认值,意思是最大值在右下角;可以设置成FALSE,那么最大值将在右上角。

drop    
这个如果是真会自动删除没有数据的坐标轴。默认是真。
p <- qplot(carat,price,color=color,data=diamonds,
      geom='point') + geom_smooth(method='lm',size=1) +
  scale_color_brewer(palette='Set1')
p + facet_wrap(~cut)

p + facet_wrap(~cut, ncol=1)

p + facet_wrap(~cut+clarity, ncol=4)
## Warning in loop_apply(n, do.ply): NaNs produced
## Warning in loop_apply(n, do.ply): NaNs produced

p + facet_wrap(~clarity+cut, ncol=4, scales="free")
## Warning in loop_apply(n, do.ply): NaNs produced
## Warning in loop_apply(n, do.ply): NaNs produced

上面的图形也可以将一个边按照cut,另一个边按照clarity来放置。这就是最后一种放置方法:facet_grid

p + facet_grid(clarity~cut)
## Warning in loop_apply(n, do.ply): NaNs produced
## Warning in loop_apply(n, do.ply): NaNs produced

facet_grid的选项中没有ncol和nrow,因为它们由数据的内容已经确定了,剩下的参数大部分和facet_wrap重合,其他参见文档。对于单行和单列的facet_wrapfacet_grid.~var, var~.是一致的(注意到grid的列变量的标签位置与wrap不同)。比如:

mt <- ggplot(mtcars, aes(mpg, wt, colour = factor(cyl))) + geom_point()

mt + facet_wrap(~gear, nrow=1)

mt + facet_grid(.~gear)

mt + facet_wrap(~gear, ncol=1)

mt + facet_grid(gear~.)

不难发现到现在为止我们绘制的图形中,标签的大小写都和想要的样式不太一样,这些名称是从data.frame里直接继承来的,所以如果要自动的获得良好的标签名一个好的选择是在数据源中就给这些变量取一个好的名字。但是,如果你只想修改图形中的这些标签怎么办呢?关于这个问题,将在下一讲中讨论ggplot中各种标签的控制方法。

亲,给点评论吧!