# library gridExtra and grid packages #
library(gridExtra)
library(grid)

# Basic usage #
# d is data.frame #
d <- head(iris[,1:3])
grid.table(d)

# grid.newpage() 開新桌布 #
# 避免圖表疊在一起 #
grid.newpage()

Spacing

透過ttheme_default 可以用文字顯示符號, 設定parse為TRUE

d[2,3] <- "this is very wwwwwide"
d[1,2] <- "this\nis\ntall"

改變行的名字

colnames(d) <- c("alpha*integral(xdx,a,infinity)",
                 "this text\nis high", 'sigma/beta')
cc <- ttheme_default(colhead=list(fg_params = list(parse=TRUE)))
grid.table(d, theme=cc)

改變列的名字

rownames(d) <- c("beta/alpha","mu",'sigma','lambda','sigma^2','delta')
rr <- ttheme_default(rowhead=list(fg_params = list(parse=TRUE)))
grid.table(d, theme=rr)

同時改變行與列的名字

bb <- ttheme_default(colhead=list(fg_params = list(parse=TRUE)),rowhead=list(fg_params = list(parse=TRUE)))
grid.table(d,theme=bb)

# 比較ttheme_default and ttheme_minimal

# 表格格式由 ttheme_default and ttheme_minimal 兩個函式建構 #
# ttheme_minimal 不秀出格線 #
tt1 <- ttheme_default()
tt2 <- ttheme_minimal()
grid.arrange(
  tableGrob(iris[1:4, 1:2], theme=tt1),
  tableGrob(iris[1:4, 1:2], theme=tt2),
  nrow=1)

tt3 <- ttheme_minimal(
  core=list(bg_params = list(fill = blues9[1:4], col=NA),
            fg_params=list(fontface=3)),
  colhead=list(fg_params=list(col="darkblue", fontface=4L)),
  rowhead=list(fg_params=list(col="orange", fontface=3L)))
grid.table(iris[1:4, 1:2], theme=tt3)

# 製造梯度顏色 #
# 橘漸層到白 #
colors <- colorRampPalette(c("orange", "white"))(4)
colors
## [1] "#FFA500" "#FFC355" "#FFE1AA" "#FFFFFF"
# 細微調整 #
# col改變顏色 #
# fontface ???? #
tt3 <- ttheme_minimal(
  core=list(bg_params = list(fill = colors[1:4], col=1),
            fg_params=list(fontface=1)),
  colhead=list(fg_params=list(col="red", fontface=4L)),
  rowhead=list(fg_params=list(col="orange", fontface=3L)))
grid.table(iris[1:4, 1:2], theme=tt3)

# 結合

colors <- colorRampPalette(c("yellow", "white"))(6)
rr <- ttheme_minimal(
  core=list(bg_params = list(fill = colors[1:6], col=NA),
            fg_params=list(fontface=3)),
  rowhead=list(fg_params = list(parse=TRUE,col="orange", fontface=3L)),
  colhead=list(fg_params = list(parse=TRUE,col="darkblue", fontface=7L))
)
grid.table(d, theme=rr)

# About hjust, vjust

# hjust = 1 靠右, = 0 靠左 #
# vjust = 1 靠上, = 0 靠下 #
tt1 <- ttheme_default()
tt2 <- ttheme_default(core=list(fg_params=list(hjust=1, x=0.9)),
                      rowhead=list(fg_params=list(hjust=1, x=0.95)))
tt3 <- ttheme_default(core=list(fg_params=list(hjust=0, x=0.1)),
                      rowhead=list(fg_params=list(hjust=0, x=0)))
grid.arrange(
  tableGrob(mtcars[1:4, 1:2], theme=tt1),
  tableGrob(mtcars[1:4, 1:2], theme=tt2),
  tableGrob(mtcars[1:4, 1:2], theme=tt3),
  nrow=1)

# 修改格子大小 #
g <- g2 <- tableGrob(iris[1:4, 1:3], cols = NULL, rows=NULL)
g$widths
## [1] max(1grobwidth, 1grobwidth, 1grobwidth, 1grobwidth)+4mm
## [2] max(1grobwidth, 1grobwidth, 1grobwidth, 1grobwidth)+4mm
## [3] max(1grobwidth, 1grobwidth, 1grobwidth, 1grobwidth)+4mm
# 變更寬度 #
# 可以查看unit函數 #
g2$widths <- unit(rep(1/ncol(g2), ncol(g2)), "npc")
grid.arrange(rectGrob(), rectGrob(), nrow=1)
grid.arrange(g, g2, nrow=1, newpage = FALSE)

# 表格合併 #
d1 <- PlantGrowth[1:3,1, drop=FALSE]
d2 <- PlantGrowth[1:2,1:2]

g1 <- tableGrob(d1)
g2 <- tableGrob(d2)

# along = 1 水平結合 #
# alnog = 2 垂直結合 #
haligned <- gtable_combine(g1,g2, along=1)
# 一行 # 
valigned <- gtable_combine(g1,g2, along=2)

grid.newpage()
grid.arrange(haligned, valigned, ncol=2)

加入隔線

使用rectGrob

# 分別加入隔線 #
# b 為總列數(預設為1),t為從最上面數下來第幾行開始畫 #
# r 為總列數(預設為1),l為從最左邊往右數第幾列開始畫 #
library(gtable)
grid.newpage()
# rows = NULL 不讀進label那一行 #
g <- tableGrob(iris[1:4, 1:3], rows = NULL)
g <- gtable_add_grob(g,
                     grobs = rectGrob(gp = gpar(fill = NA, lwd = 8)),
                     t = 4, b = nrow(g), l = 1, r = ncol(g))
g <- gtable_add_grob(g,
                     grobs = rectGrob(gp = gpar(fill = NA, lwd = 2)),
                     t = 1, l = 1, r = ncol(g))
grid.draw(g)

飆出特定線

# 基本x 1 unit長為 t列到 b列的距離 ,y 1 unit 長為 l行到 r行
grid.newpage()
g <- tableGrob(iris[1:4, 1:3])
g <- gtable_add_grob(g,
                     grobs = segmentsGrob( # line across the bottom
                       x0 = unit(0,"npc"),
                       y0 = unit(0,"npc"),
                       x1 = unit(1,"npc"),
                       y1 = unit(1,"npc"),
                       gp = gpar(lwd = 2.0)),
                     t = 3, b = 4, l = 3, r = 3)
grid.draw(g)

# 交叉線 #
grid.newpage()
g <- tableGrob(iris[1:4, 1:3])
g <- gtable_add_grob(g,
                     grobs = grobTree(
                       segmentsGrob( # diagonal line ul -> lr
                         x0 = unit(0,"npc"),
                         y0 = unit(1,"npc"),
                         x1 = unit(1,"npc"),
                         y1 = unit(0,"npc"),
                         gp = gpar(lwd = 2.0,col = 'red')),
                       segmentsGrob( # diagonal line ll -> ur
                         x0 = unit(0,"npc"),
                         y0 = unit(0,"npc"),
                         x1 = unit(1,"npc"),
                         y1 = unit(1,"npc"),
                         gp = gpar(lwd = 2.0,col ='blue'))),
                     t = 3, b = 3, l = 3, r = 3)
grid.draw(g)

不同呈現方式

# 在每行左邊加上虛線
grid.newpage() 
g <- tableGrob(head(iris), theme = ttheme_minimal())
separators <- replicate(ncol(g) - 2,
                        segmentsGrob(x1 = unit(0, "npc"), gp=gpar(lty=2)),
                        simplify=FALSE)
## add vertical lines on the left side of columns (after 2nd)
g <- gtable::gtable_add_grob(g, grobs = separators,
                             t = 2, b = nrow(g), l = seq_len(ncol(g)-2)+2)
grid.draw(g)

# 在每列上方加上虛線
grid.newpage() 
g <- tableGrob(head(iris), theme = ttheme_minimal())
separators <- replicate(nrow(g) - 1,
                        segmentsGrob(x0 = unit(0,"npc"),
                         y0 = unit(1,"npc"),
                         x1 = unit(1,"npc"),
                         y1 = unit(1,"npc"), gp=gpar(lty=2)),
                        simplify=FALSE)
## add vertical lines on the left side of columns (after 2nd)
g <- gtable::gtable_add_grob(g, grobs = separators,
                             t = seq_len(nrow(g)-1)+1, l = 2, r = 6)
grid.draw(g)