通過與劇情相關的圖形對象(grobs)挖後,我遇到了一個潛在的黑客繞過這個問題。雖然不如Z.Lin's solution那麼優雅,但我想分享它用於教育目的。
首先,我們通過檢索grobs與
gt <- ggplotGrob(g + facet_wrap(~V3, scales = "free"))
## TableGrob (11 x 11) "layout": 20 grobs
## z cells name grob
## 1 0 (1-11, 1-11) background rect[plot.background..rect.105]
## 2 1 (7- 7, 4- 4) panel-1-1 gTree[panel-1.gTree.17]
## 3 1 (7- 7, 8- 8) panel-2-1 gTree[panel-2.gTree.30]
## 4 3 (5- 5, 4- 4) axis-t-1-1 zeroGrob[NULL]
## 5 3 (5- 5, 8- 8) axis-t-2-1 zeroGrob[NULL]
## 6 3 (8- 8, 4- 4) axis-b-1-1 absoluteGrob[GRID.absoluteGrob.43]
## 7 3 (8- 8, 8- 8) axis-b-2-1 absoluteGrob[GRID.absoluteGrob.50]
## 8 3 (7- 7, 7- 7) axis-l-1-2 absoluteGrob[GRID.absoluteGrob.64]
## 9 3 (7- 7, 3- 3) axis-l-1-1 absoluteGrob[GRID.absoluteGrob.57]
## 10 3 (7- 7, 9- 9) axis-r-1-2 zeroGrob[NULL]
## 11 3 (7- 7, 5- 5) axis-r-1-1 zeroGrob[NULL]
## 12 2 (6- 6, 4- 4) strip-t-1-1 gtable[strip]
## 13 2 (6- 6, 8- 8) strip-t-2-1 gtable[strip]
## 14 4 (4- 4, 4- 8) xlab-t zeroGrob[NULL]
## 15 5 (9- 9, 4- 8) xlab-b titleGrob[axis.title.x..titleGrob.33]
## 16 6 (7- 7, 2- 2) ylab-l titleGrob[axis.title.y..titleGrob.36]
## 17 7 (7- 7,10-10) ylab-r zeroGrob[NULL]
## 18 8 (3- 3, 4- 8) subtitle zeroGrob[plot.subtitle..zeroGrob.102]
## 19 9 (2- 2, 4- 8) title zeroGrob[plot.title..zeroGrob.101]
## 20 10 (10-10, 4- 8) caption zeroGrob[plot.caption..zeroGrob.103]
Grobs是分層的對象和遍歷這些結構的一般規則分爲兩類:
- 如果格羅是
gtable
類型(如gt
上面),訪問進入表格的個人數據庫可以通過$grobs
完成。
- 如果grob不是
gtable
類型,則可以通過$children
訪問其子孩子的grobs。
看上面的gtable
,我們觀察到梯形6和7分別對應於刻面1和2的底部軸線。每個軸grobs的是absoluteGrob
類型的,所以使用上述兩個規則,我們可以檢查他們的喜歡這件事做什麼:
gt$grobs[[6]]$children
## (zeroGrob[axis.line.x..zeroGrob.40], gtable[axis])
## and likewise for gt$grobs[[7]]$children
注意到第二個孩子是gtable
,我們可以繼續降直到我們到達gt$grobs[[6]]$children[[2]]$grobs[[2]]$children[[1]]
,這是grob層次結構的葉子(其$children
爲NULL
),並對應於軸文本。讓我們來看看它的圖形參數,這可以通過$gp
來訪問:
## Double-check that we have the correct text object
gt$grobs[[6]]$children[[2]]$grobs[[2]]$children[[1]]$label
## [1] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J" "K" "L" "M"
## Display the summary of graphical parameters
str(gt$grobs[[6]]$children[[2]]$grobs[[2]]$children[[1]]$gp)
## List of 5
## $ fontsize : num 8.8
## $ col : chr [1:26] "black" "black" "black" "red" ...
## $ fontfamily: chr ""
## $ lineheight: num 0.9
## $ font : Named int 1
## ..- attr(*, "names")= chr "plain"
## - attr(*, "class")= chr "gpar"
注意,col
屬性是長度26的和精確地對應於從問題的v
變量。如果我們看第二個方面的底部軸(gt$grobs[[7]]$...
),我們看到在那裏也使用了相同的col
值,從而在兩個方面導致相同的軸文本着色(如Z.Lin的解決方案中所建議的)。
因此,將這些顏色設置設置爲v
「手動」的相應部分,可以讓我們修改原始圖並獲得理想的結果。
gt$grobs[[6]]$children[[2]]$grobs[[2]]$children[[1]]$gp$col <- v[1:13]
gt$grobs[[7]]$children[[2]]$grobs[[2]]$children[[1]]$gp$col <- v[14:26]
grid::grid.draw(gt)
爲什麼不張貼你的答案正確的答案?你也許還會在「遇到潛在的黑客攻擊」部分進行擴展 - 從其他答案中,我意識到在grobs之間進行定向可能相當棘手...... Cheers – Henrik
謝謝Henrik。偉大的建議。我發佈了一個答案,擴展瞭如何瀏覽grob層次結構。 –
優秀!非常感謝。加上馬上! – Henrik