1 简介
R包——customLayout,它可以用来完成自由拼图,可以使用矩阵自定义图形位置和顺序,用数字来定义每一个模块的长宽比。这个包不仅支持数字拼图,还支持R内置的base绘图对象、grid绘图对象等(也就是支持ggplot2对象)。
customLayout包有CRAN版本,也有github版本可供下载:
install.packages("customLayout")
devtools::install_github("zzawadz/customLayout")
2 简单的数字拼图
通过设置简单的数字矩阵以及对应的宽高比,可以非常方便的设置出来数字拼图。
其中mat指定要拼图的数字矩阵,将1:4数字按照纵向顺序拼成两行,其中宽对比为3:2,高度比为2:1。mat数字矩阵必须从1开始,且必须连续。
关键函数:
-
lay_new()
创建拼图画布 -
lay_show()
显示拼图画布
library(customLayout)
library(magrittr)
#创建拼图画布
lay <- lay_new(
mat = matrix(1:4, ncol = 2), #矩阵分布,码头表示指定排版矩阵
widths = c(3, 2), #设置宽度比
heights = c(2, 1)) #设置高度比
lay_show(lay) #显示拼图画布
image.png
3 合并画布
跟合并矩阵类似,分为行合并和列合并。
关键函数:
-
lay_bind_col()
画布列合并 -
lay_bind_col(x, y, widths = c(1, 1), addmax = TRUE)
参数widths表示指定合并宽度比 -
lay_bind_row()
画布行合并 -
lay_bind_row(x, y, heights = c(1, 1), addmax = TRUE)
参数heights表示指定合并高度比
# 创建第二块画布
lay2 <- lay_new(
matrix(1:4, nc = 2),
widths = c(3, 5),
heights = c(2, 4))
lay_show(lay2)
image.png
3.1 横向拼接画布
# 横向拼接画布
cl = lay_bind_col(lay, lay2, widths = c(3, 1))
lay_show(cl)
image.png
3.1 纵向拼接画布
# 纵向拼接画布
cl2 = lay_bind_row(lay, lay2, widths = c(3, 1))
lay_show(cl2)
image.png
不同层级的对象仍然支持拼接在一起。
# 3.3 组合拼接画布
lay3 <- lay_new(matrix(1:2))
lay4 <- lay_bind_row(cl, lay3, heights = c(5, 2))
lay_show(lay4)
image.png
4 画布嵌套
将一个模块嵌入到一个模块特定位置。
关键函数:
lay_split_field(lay, newlay, field)
# 这里就将lay2嵌入到lay模块的第四个区域,但may2内部的布局结构任然不变。
lay <- lay_new(
matrix(1:4, nc = 2),
widths = c(3, 2),
heights = c(2, 1))
lay_show(lay)
lay2 <- lay_new(
matrix(1:4, nc = 2),
widths = c(3, 5),
heights = c(2, 4))
lay_show(lay2)
slay <- lay_split_field(lay, lay2, field = 4)
lay_show(slay)
image.png
5填充图片
关键函数:
-
lay_set(layout)
将画布layout设置为绘图布局,用于base绘图对象 -
lay_grid(grobs, lay, ...)
将绘图对象grobs填充到画布lay中, 用于ggplot2等绘图对象
5.1 基础绘图对象填充
par(mar = c(3, 2, 2, 1)) #设定页边距,创建画布
lay <- lay_new(
matrix(1:4, nc = 2), #2行2列
widths = c(3, 2),
heights = c(2, 1))
lay2 <- lay_new(matrix(1:3)) #3行1列
cl <- lay_bind_col(lay, lay2, widths = c(3, 1)) #画布合并
lay_show(cl)
lay_set(cl) # initialize drawing area
set.seed(123)
plot(1:100 + rnorm(100)) #填充第1格
plot(rnorm(100), type = "l") #填充第2格
hist(rnorm(500)) #填充第3格
acf(rnorm(100)) #填充第4格
pie(c(3, 4, 6), col = 2:4)
pie(c(3, 2, 7), col = 2:4 + 3)
pie(c(5, 4, 2), col = 2:4 + 6)
image.png
image.png
5.2 ggplot2绘图对象填充
library(ggplot2)
library(gridExtra)
library(customLayout)
lay <- lay_new( matrix(1:2, ncol = 1))
lay2 <- lay_new(matrix(1:3))
cl <- lay_bind_col(lay, lay2, widths = c(3, 1))
cuts <- sort(unique(diamonds[["cut"]]),decreasing = TRUE)
make_cut_plot <- function(cut) {
dd <- diamonds[diamonds[["cut"]] == cut, ]
ggplot(dd) +
geom_point(aes(carat, price)) +
facet_wrap("cut") #封装分面
}
plots <- lapply(cuts, make_cut_plot) #对不同cut水平作图
lay_grid(plots, cl) # 将图对象依次填充到cl画布
image.png
image.png