在繪圖時,有時候會遇到這樣一種情景,客戶想把多個代表不同KPI的圖形分布到同一個畫布(Page)上,而且每一個圖形都是單獨繪制的。對於這種需求,可以使用gridExtra包來實現,gridExtra包能把圖形逐個地添加到畫布中,並按照業務的需求,把圖形擺放到合適的位置上去。在布局完成之后,把圖形繪制出來。也就是說,gridExtra用於把幾張圖拼成一組圖,可以把ggplot2繪制的多張圖形組合到一個大圖中。通常情況下,gridExtra包常用於控制圖形的復雜布局和繪制文本表,本文簡單介紹gridExtra包的布局功能。
一,友好函數
gridExtra提供用於布局的友好函數:
arrangeGrob(..., grobs = list(...), layout_matrix, vp = NULL, name = "arrange", as.table = TRUE, respect = FALSE, clip = "off", nrow = NULL, ncol = NULL, widths = NULL, heights = NULL, top = NULL, bottom = NULL, left = NULL, right = NULL, padding = unit(0.5, "line")) grid.arrange(..., newpage = TRUE)
這兩個函數的區別是:arrangeGrob()返回未繪制的grob,而grid.arrange()函數在當前的設備上繪圖圖形。
參數注釋:
- ...:grobs、ggplot、lattice等grob(圖形對象)
- grobs:對象對象的list
- layout_matrix:表示布局的矩陣
gridExtra是grid包的友好版本,在grid包中,grob是一個可編輯的繪圖對象,grob是graphical object兩個單詞的前兩個字符的組合。常用於表示ggplot對象,lattice等高級圖形系統創建圖形對象。
二,gridExtra布局的基本用法
grid.arrange()函數,不僅能夠控制個數已知的圖形布局,還能對控制未知個數的圖形布局,功能十分強大。
1,控制多個grob的布局
把ggplot2和lattice繪制的圖形對象,分兩列,並排顯示:
library(gridExtra) library(ggplot2) library(lattice) p <- qplot(1,1) p2 <- xyplot(1~1) ##lattice包 grid.arrange(p,p2,ncol = 2)
2,控制grob列表的布局
把繪圖對象添加到列表中,並把該列表傳遞給grid.arrange()函數的grobs參數:
library(gridExtra) library(ggplot2) library(lattice) gs <- list(NULL) gs[[1]] <- qplot(1,1) gs[[2]] <- xyplot(1~1) ##lattice包 grid.arrange(grobs=gs,ncol = 2)
3,使用矩陣設置復雜布局
各個圖形對象排放的位置,可以通過布局矩陣(layout_matrix)來控制:
lay <- rbind(c(1,1,1,2,3), c(1,1,1,4,5), c(6,7,8,9,9)) grid.arrange(grobs = gs,layout_matrix = lay)
三,在圖形內部繪圖
ggplot2包中有一個用於創建grob對象的函數,參數x是一個ggplot對象:
ggplotGrob(x)
我們可以通過添加注釋(annotate)的方式,向一個圖形內部添加一個圖形:
annotation_custom(grob, xmin = -Inf, xmax = Inf, ymin = -Inf, ymax = Inf)
例如:向大圖形中添加一個小圖形:
library(gridExtra) library(ggplot2) g <- ggplotGrob(qplot(1, 1) + theme(plot.background = element_rect(colour = "black"))) qplot(1:10, 1:10) + annotation_custom( grob = g, xmin = 1, xmax = 5, ymin = 5, ymax = 10 )
參考文檔: