Positioning
7.1 简介
本章主题是图形的定位。
定位由四个部分组成,前两个在前期讲过,而后两个部分在这章中会详细说到:
- 位置调整:调整每个图层中出现重叠的对象的位置
- 位置标度:控制数据到图形的映射
- 分面:在一个页面上自动摆放多个图形。将数据分为多个子集,然后将每个子集依次绘制到不同面板上
- 坐标系:控制两个独立的位置标度形成一个二维坐标系,如笛卡尔坐标系
7.2 分面
每个小图都代表不同的数据子集。分面可以快速地分析数据各子集模式的异同。
本节讨论怎样较好微调分面,特别是和位置标度相关的方法。
facet_null()
:默认,无分面,单一图形。face_wrap()
:封装型,本质上是1维,为节省空间封装成二维face_grid()
:网格型,生成一个二维的面板由两个独立的部分组成,,面板的行和列可以通过变量来定义
facet_wrap()
使用这个参数设置一长串面板二维排列,更加节省空间
可以通过ncol
,nrow
,as.table
,dir
等参数设置排列。
如下例:
library(ggplot2)
## 从mpg数据集中取一个子集mpg2
mpg2 <- subset(mpg, cyl != 5 & drv %in% c("4", "f") & class != "2seater")
base <- ggplot(mpg2, aes(displ, hwy)) +
geom_blank() +
xlab(NULL) +
ylab(NULL)
base
## 添加分面,设置ncol或nrow(二选一即可)
base + facet_wrap(~class, ncol = 3)
## 设置as.table
base + facet_wrap(~class, ncol = 3, as.table = FALSE)
as.table
决定各个分面的排列顺序。
## 设置dir,水平或垂直排列
base + facet_wrap(~class, nrow = 3, dir = "v")
facet_grid()
网格分面,在二维网格中展示图形。
需要设定哪些变量作为分面绘图的行,哪些变量作为列,中间用~
短波浪线做标记。
如下例:
mpg2 <- subset(mpg, cyl != 5 & drv %in% c("4", "f") & class != "2seater")
base <- ggplot(mpg2, aes(displ, hwy)) +
geom_blank() +
xlab(NULL) +
ylab(NULL)
## 一行多列
base + facet_grid(. ~ cyl)
## 一列多行
base + facet_grid(drv ~ .)
## 多行多列
base + facet_grid(drv ~ cyl)
依次生成下列三种:
控制标度
• scales = "fixed"
: x 和 y的标度在所有分面中都相同(默认)
• scales = "free_x"
: x 的标度可变,y 固定
• scales = "free_y"
: y 的标度可变,x 固定
• scales = "free"
: x 和 y 的标度都可变
如下例:
p <- ggplot(mpg2, aes(cty, hwy)) +
geom_abline() +
geom_jitter(width = 0.1, height = 0.1)
## 默认各个分面标度一致
p + facet_wrap(~cyl)
## 设置分面标度可变
p + facet_wrap(~cyl, scales = "free")
依次生成下图:
固定标度可以让我们在相同的基准上对子集进行比较
自由标度可以帮助我们看到更多细节
在变量y单位、数量级不同时,单独固定x轴,不限制y轴也很常用。如下例,经济数据集:
> economics_long
# A tibble: 2,870 x 4