我正在使用类似于以下内容的情节:
ggplot(data=mtcars, aes(x=wt, y=mpg, color=carb)) +
geom_line() + facet_grid(gear ~ .) +
ggtitle(expression("Title")) +
labs(caption = "Sources: Compustat, Author's Calculations") +
theme(plot.title = element_text(size = 20, hjust = 0.5),
plot.caption=element_text(size=8, hjust=.5),
strip.background = element_blank(),
strip.text = element_blank(),
legend.title = element_blank())
我正在尝试执行以下操作:
我能够在为每个方面分配图例时重现this示例。 但是,情节标题位于上方,每个方面下方都有标题。此外,此示例使用facet_wrap而不是facet_grid。
提前谢谢你。
答案 0 :(得分:1)
library(dplyr)
library(ggplot2)
tempgg <- mtcars %>%
group_by(gear) %>%
do(gg = {ggplot(data=., aes(x=wt, y=mpg, color=carb)) +
geom_point() +
labs(x = NULL) +
guides(color = guide_colorbar(title.position = "left")) +
theme(plot.title = element_text(size = 20, hjust = 0.5),
plot.caption=element_text(size=8, hjust=.5),
legend.position = "bottom")})
tempgg$gg[1][[1]] <- tempgg$gg[1][[1]] + labs(title = "Top title")
tempgg$gg[3][[1]] <- tempgg$gg[3][[1]] + labs(x = "Axis label", caption = "Bottom caption")
tempgg %>% gridExtra::grid.arrange(grobs = .$gg)
这不是最优雅的方式。当你grid.arrange
时,三个凹陷中的每一个都会得到一个相等的空间,所以第一个和最后一个都会从标题和标题中占用空间。您可以在heights = c(3,2,3)
调用中添加grid.arrange
之类的内容,但是您必须调整每个高度以使其看起来正确,即使这样,它也会是视觉近似,不确切。
要以更精确的方式做到这一点,您需要查看每个grob中的基础gtables。 https://stackoverflow.com/users/471093/baptiste就是专家。
我使用的是@baptiste解决方案,它仍然不是特别优雅,但为每个面板提供相同的绘图空间。使用此代码段代替上面的最后一行。
tempggt <- tempgg %>% do(ggt = ggplot_gtable(ggplot_build(.$gg))) %>% .$ggt
gg1 <- tempggt[[1]]
gg2 <- tempggt[[2]]
gg3 <- tempggt[[3]]
gridExtra::grid.arrange(gridExtra::rbind.gtable(gg1, gg2, gg3))