1. 简介
本章的主题是图像的定位,主要讲解了布局分面和坐标系如何工作两个问题。定位由4个部分组成,在之前于分面有关的篇章中,学习了其中的2个部分:
- 位置调整每个图层中出现重叠的对象的位置。该方法对条形图和其它有组距的几何对象非常有用,同时也适用于其它情形、
- 位置标度控制数据到图像中位置的映射
- 分面即在一个页面上自动摆放多幅图像的技法:先将数据划分为多个子集,然后将每个子集依次绘制到页面的不同面板中。这类图像通常被称为小联号图(small multiples)或栅栏图(trellis graphics)
- 坐标系即通过控制两个独立的位置标度来生成1个2维的坐标系,最常见的是笛卡尔坐标系,在特定的情形中也可以适用其它种类的坐标系
2. 分面
分面通过切割数据生成一系列小联号图,每个小图表示不同的数据子集。对探索性数据分析而言,分面是一个有用的工具。它能快速地分析出数据各子集模式的异同。这里要讨论的是如何较好地微调分面,特别是与位置标度相关地方法
有3种分面类型
- facet_null() 单个图像,默认情况
- facet_wrap() 把1维面板条块“封装(wrap)”在2维中
- facet_grid() 生成1个2维的面板网络(grid),其中行和列由变量组成
分面绘图通常会占用大量页面空间,因此本章使用mpg数据集的子集来进行展示
mpg2 <- subset(mpg,
cyl != 5 & drv %in% c("4", "f") & class != "2seater")
1. 封装分面
facet_wrap()先生成一个长的面板条块(由任意数目的变量生成),然后将它封装在2维面板中。在处理单个多水平变量时,这种处理方式非常有用,它可以有效的利用空间来安放图像
可以用ncol、nrow、as.table和dir来控制网格如何封装条块。ncol和nrow控制着有多少列和多少行(只需设置其中一个参数)。as.table控制着分面的布局:按照表格方式布局的话,最高值显示在右下角,按照图像方式布局的话,最高值显示在右上角。dir控制着封装的方向:h表示着横向(horizontal),v表示着纵向(vertical)
base <- ggplot(mpg2, aes(displ, hwy)) + geom_blank() +
xlab(NULL) + ylab(NULL)
base + facet_wrap(~class, ncol = 3)
base + facet_wrap(~calss, ncol = 3, as.table = FALSE)
base + facet_wrap(~class, nrow = 3)
base + facet_wrap(~class, nrow = 3, dir = "v")
2. 网格分面
facet_grid()在2维网络中展示图像,用以下表达式来定义
- . ~ a 把a的值按列展开。因为纵坐标轴对齐了,这个方向有助于y位置的比较
base + facet_grid(. ~ cyl)
- b ~ . 把b的值按行展开。因为横坐标轴对齐了,这个方向有利于x位置的比较,尤其是对数据分布的比较
base + facet_grid(drv ~ .)
- a ~ b把a按列展开,把b按行展开。通常来说,都会把因子水平数多的变量按列排放,这样可以充分利用屏幕的宽高比
base + facet_grid(drv ~ cyl)
在行和列上,可以通过“相加”来放置多个变量,比如说 a + b ~ c + d。变量在某行或某列一起出现时,图像只会展示数据中出现的变量组合。而变量在行和列都出现时,图像将展示所有的变量组合,包括在原始数据中没有出现地组合,此外这也可能会导致出现空白面板的情形