1. 程式人生 > >一個敲有趣的R語言拼圖工具

一個敲有趣的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

閱讀原文了解課程詳情: