使用facet_grid将图例放在每个构面下;添加一个标题和一个标题来绘图

时间:2017-08-15 16:01:07

标签: r ggplot2

我正在使用类似于以下内容的情节:

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())

我正在尝试执行以下操作:

  • 在3个构面中的每个构面下方插入图例,每个构图都特定于其上方的构面。
  • 插入一个地块标题(而不是每个方面上方的相同标题)。
  • 在最终刻面下方插入一个标题(而不是每个刻面下方的三个标题)。

我能够在为每个方面分配图例时重现this示例。 但是,情节标题位于上方,每个方面下方都有标题。此外,此示例使用facet_wrap而不是facet_grid。

提前谢谢你。

1 个答案:

答案 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)

enter image description here

这不是最优雅的方式。当你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))