你是不是常常为了一页多图的繁琐布局设置而苦恼呢?R语言中customLayout包也许能帮到你哟。它可以把几张不同的图拼在一张图上,用简单容易的操作命令来完成繁琐的图片布局设置。
customLayout包
customLayout包就是一个图表对象布局工具,它可以完成自由拼图,使用矩阵自定义图形位置和顺序,用数字来定义每一个模块的长宽比等功能。这个包不仅支持数字拼图,还支持R内置的base绘图对象、grid绘图对象等(也就是支持ggplot2对象)。
下面简单介绍其函数和用法
customLayout包的下载与安装
github版本中可供下载:
install.packages("customLayout")
devtools::install_github("zzawadz/customLayout")
用法函数主要有:
创建:lay_new()
这个函数是后续所有命令的基础,所有的绘图命令都将以它开始,它的主要任务是创建一个 custom layout 对象,后续的拼接、嵌套、设置的对象都是基于这种 custom layout 对象。
定义:lay_new(mat, widths = NULL, heights = NULL)
参数含义:
mat:矩阵-指定每个图形的位置
widths:向量-指定 mat 中每列所代表的相对宽度
heights:向量-指定 mat 中每行所代表的相对高度
拼接:lay_bind_row()
嵌套:lay_split_field()
预览展示当前布局:lay_show()
基础图层:lay_set()
网格图层:lay_grid()
下面通过简单例子介绍其用法
01.简单的数字拼图
通过设置简单的数字矩阵以及对应的宽高比,可以非常方便的设置出来数字拼图:
![]() |
02.基础绘图对象的拼接
library(customLayout)
set.seed(123)
par(mar = c(3, 2, 2, 1))
# 设置图层的布局
lay <- lay_new(matrix(1:4, nc = 2), #创建2行2列的绘图区域lay
widths = c(3, 2),
heights = c(2, 1))
lay2 <- lay_new(matrix(1:3)) #创建3行1列的绘图区域lay2
cl <- lay_bind_col(lay, lay2, widths = c(3, 1)) #lay和lay2横向拼接合并,宽度比例为3:1
lay_set(cl) #初始化绘图区域
# 绘制相应区域的图
plot(1:100 + rnorm(100)) #绘制区域在最初定义的lay 2 行2列区域
plot(rnorm(100), type = "l")
hist(rnorm(500))
acf(rnorm(100))
pie(c(3, 4, 6), col = 2:4) #绘制区域在最初定义的lay2 3行1列区域
pie(c(3, 2, 7), col = 2:4 + 3)
pie(c(5, 4, 2), col = 2:4 + 6)
![]() |
03.grid(ggplot2)图形对象的拼接
library(ggplot2)
library(customLayout)
library(gridExtra)
l1 <- lay_new(matrix(1:2, ncol = 1), heights = c(2, 3)) #创建l1绘图区域
l2 <- lay_new(matrix(1:2, ncol = 1), heights = c(1, 1)) #创建l2绘图区域
l3 <- lay_bind_col(l1, l2) #将前两个区域横向拼接
pl1 <- qplot(mpg, wt, data = mtcars)
pl2 <- qplot(mpg, gear, data = mtcars)
set.seed(200)
df<-diamonds[sample(nrow(diamonds),5000),]
pl3<-ggplot(data=df,aes(carat,price))+geom_point(aes(colour=cut))+theme(legend.position='none')
pl4<-p+scale_color_hue(h=c(50,300),c=80,l=80)
lay_grid(list(pl1, pl2, pl3, pl4), l3) #将绘制的图片放入指定的区域
![]() |
customLayout包的版式布局思想非常简单,就是基于数值矩阵的模块化分割;同时不同层级的模块也可相互拼接,这样就可以像拼七巧板一样拼出很多奇形怪状的版式出来,甚至你使用这种版式来设计一个富有美感的照片拼图或者海报都有可能。
今日份知识,您掌握了吗?
更多精彩,敬请期待!
Bye了个Bye~