我無法理解如何將 grobs 放入繪圖區域。這是我的意思的一個例子。假設我有以下情節。
library(tidyverse)
p <- mpg %>%
ggplot(aes(year))
geom_bar()
p

我知道我可以從中得到一個 grobs 串列并像這樣繪制它。
l <- ggplotGrob(p)
grid::grid.newpage()
grid::grid.draw(l)
從串列的結構中,l我也了解到矩形被繪制為rectGrobs。我在里面找到了這些。
grobs <- l$grobs[[6]]
rect_grobs <- grobs$children[[3]]
但是,如果我想使用直接來自 的資料繪制至少一個矩形rect_grobs,則不會發生任何事情。這與我是否創建新畫布grid::grid.newpage()無關。
# This draws nothing
grid::grid.draw(
grid::rectGrob(
x = rect_grobs$x[1],
y = rect_grobs$y[1],
height = rect_grobs$height[1],
width = rect_grobs$width[1],
just = rect_grobs$just[1],
)
)
但是,如果我手動插入值rect_grobs,則會在錯誤的位置繪制一個矩形。我懷疑這與視口有關,但我嘗試查看,l但我不知道設定了什么視口。無論我在哪里看,只有.grobsrect_grobsvp = NULL
# This draws in wrong position
grid::grid.draw(
grid::rectGrob(
x = 0.0455,
y = 0.955,
width = 0.431,
height = 0.909,
just = 'left'
)
)

所以,我的問題是
- 如果我直接從串列中獲取值,為什么代碼不繪制矩形
rect_grobs? - 如果我手動添加矩形,如何將它放到正確的位置?
uj5u.com熱心網友回復:
不繪制的原因rect_grobs確實是它沒有視口。如果 grob 沒有設定視口,它將從其父級繼承,但由于您已將其從 a 中取出gTable,因此它沒有父級。這很容易通過給它一個默認視口來糾正:
rect_grobs$vp <- grid::viewport()
grid::grid.draw(rect_grobs)

只要我們指定正確的just,我們就會在同一個地方得到矩形:
red_rect <- grid::rectGrob(
x = 0.0455,
y = 0.955,
width = 0.431,
height = 0.909,
just = c("left", "top"),
gp = grid::gpar(fill = "red")
)
grid::grid.draw(red_rect)

但是,這不是矩形在 ggplot 中的位置。那是因為在ggplot面板中有自己的視口。要在此背景關系中繪制矩形,我們需要在呼叫之前導航到正確的視口grid.draw
plot(p)
grid::seekViewport(grid::vpPath("layout", "panel.7-5-7-5"))
grid::grid.draw(red_rect)

轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/469445.html
上一篇:R中的資料框架摘要統計
