我想同时显示右边距和底部边距,但不能同时显示两者的组合。 facet_grid有可能吗?
library(ggplot2)
ggplot(mtcars, aes(x = hp, group = vs)) +
geom_density() +
facet_grid(am ~ vs, switch = "y", margins = TRUE)
我试图通过手动为margin
参数提供因子来解决此问题,但这无济于事。另外,R文档也无济于事。
当前结果
所需结果
答案 0 :(得分:6)
这样的事情对我来说是一个错误,因为我看不到大图gt
中的条目与最终形式的关系:
library(ggplot2)
p<-
ggplot(mtcars, aes(x = hp, group = vs)) +
geom_density() +
facet_grid(am ~ vs, switch = "y", margins = TRUE)
gt = ggplotGrob(p)
keep <- !grepl("[3br]-3$",gt$layout$name)
gt$layout <- gt$layout[keep,]
gt$grobs <- gt$grobs[keep]
plot(gt)
答案 1 :(得分:2)
ggplot2使用固定的惯用语来命名关键图解元素,因此我们可以使用确定性条件来查找元素:
library(ggplot2)
ggplot(mtcars, aes(x = hp, group = vs)) +
geom_density() +
facet_grid(am ~ vs, switch = "y", margins = TRUE) -> gg
将图构建为gtable
对象:
gt <- ggplot_gtable(ggplot_build(gg))
获取表格单元格名称:
cells <- gt$layout$name
弄清楚哪个是底角面板和轴:
apply(
apply(
do.call(rbind, strsplit(grep("panel", cells, value=TRUE), "-"))[,2:3],
2, as.integer),
2, max
) -> max_col_row
bottom_right_panel <- paste0(c("panel", max_col_row), collapse="-")
bottom_axis <- sprintf("axis-b-%s", max_col_row[2])
找出哪些不是底角面板:
paste0(
grep(sprintf("^%s|%s$", bottom_corner, bottom_axis), cells, value=TRUE, invert = TRUE),
collapse = "|"
) -> not_bottom_corner_panel
只画那些:
grid::grid.draw(
gtable::gtable_filter(gt, sprintf("^(%s)$", not_bottom_corner_panel))
)