在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)
其中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)
參數含義同上。
cl = lay_bind_col(lay, lay2, widths = c(3, 1)) lay_show(cl)
以上過程將前兩個例子橫向拼接,兩個模塊對象仍然支持設置款對比例(3:1)
lay3 <- lay_new(matrix(1:2)) lay4 <- lay_bind_row(cl, lay3, heights = c(5, 2)) lay_show(lay4)
不同層級的對象仍然支持拼接在一起。
除此之外,也可以將一個模塊嵌入到兩一個模塊特定位置。
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)
這裏就將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)
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)
customLayout包的版式佈局思想非常簡單,就是基於數值矩陣的模塊化分割,同時不同層級的模塊也可相互拼接,這樣就可以像拼七巧板一樣拼出很多奇形怪狀的版式出來,甚至你使用這種版式來設計一個富有美感的超照片拼圖或者海報都有可能。