一个敲有趣的R语言拼图工具


640?wx_fmt=png

双十一狂欢,全场五折带回家



作者简介

杜雨,EasyCharts团队成员,R语言中文社区专栏作者,兴趣方向为:Excel商务图表,R语言数据可视化,地理信息数据可视化。

个人公众号:数据小魔方(微信ID:datamofang) ,“数据小魔方”创始人。 


在10月CRAN更新的R包中,发现了一个挺有意思的R包——customLayout,听名字就很神奇。

它可以用来完成自由拼图,可以使用矩阵自定义图形位置和顺序,用数字来定义每一个模块的长宽比,试用了一遍简直爱不释手,在这里分享给大家。

这个包不仅支持数字拼图,还支持R内置的base绘图对象、grid绘图对象等(也就是支持ggplot2对象)。

这样的话,对于需要制作简单仪表盘的场景,完全不必要使用rmarkdown+flexdashboard或者shiny+shinydashboard也可以快速生成仪表盘原型。

customLayout包有CRAN版本,也有github版本可供下载:

install.packages("customLayout")
devtools::install_github("zzawadz/customLayout")

简单的数字拼图:

通过设置简单的数字矩阵以及对应的宽高比,可以非常方便的设置出来数字拼图:

library(customLayout)library(magrittr)

lay <- lay_new(
  mat = matrix(1:4, ncol = 2),
  widths = c(3, 2),
  heights = c(2, 1))  
lay_show(lay)

640?wx_fmt=png


其中mat指定要拼图的数字矩阵,将1:4数字按照纵向顺序拼成两行,其中宽对比为3:2,高度比为2:1。

lay2 <- lay_new(
  matrix(1:4, nc = 2),
  widths = c(3, 5),
  heights = c(2, 4))
lay_show(lay2)

参数含义同上。


640?wx_fmt=png

cl = lay_bind_col(lay, lay2, widths = c(3, 1))
lay_show(cl)

640?wx_fmt=png


以上过程将前两个例子横向拼接,两个模块对象仍然支持设置款对比例(3:1)

lay3 <- lay_new(matrix(1:2))
lay4 <- lay_bind_row(cl, lay3, heights = c(5, 2))
lay_show(lay4)

640?wx_fmt=png


不同层级的对象仍然支持拼接在一起。


除此之外,也可以将一个模块嵌入到两一个模块特定位置。

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)

640?wx_fmt=png


这里就将lay2嵌入到lay模块的第四个区域,但may2内部的布局结构任然不变。

关于图像对象的布局与拼接:

基础绘图对象的拼接:

par(mar = c(3, 2, 2, 1))
lay  <- lay_new(
  matrix(1:4, nc = 2),
  widths = c(3, 2),
  heights = c(2, 1))
lay2 <- lay_new(matrix(1:3))
cl   <- lay_bind_col(lay, lay2, widths = c(3, 1))
lay_show(cl)
lay_set(cl) # initialize drawing areaset.seed(123)
plot(1:100 + rnorm(100))
plot(rnorm(100), type = "l")
hist(rnorm(500))
acf(rnorm(100))
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)

640?wx_fmt=png


grid(ggplot2)图形对象的拼接:

library(ggplot2)library(gridExtra)

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)
lay_grid(plots, cl)

640?wx_fmt=png


customLayout包的版式布局思想非常简单,就是基于数值矩阵的模块化分割,同时不同层级的模块也可相互拼接,这样就可以像拼七巧板一样拼出很多奇形怪状的版式出来,甚至你使用这种版式来设计一个富有美感的超照片拼图或者海报都有可能。


640?wx_fmt=png

阅读原文了解课程详情:

猜你喜欢

转载自blog.csdn.net/kMD8d5R/article/details/83829520