Universal x axis label and legend at bottom using grid.arrange

本秂侑毒 提交于 2019-12-20 01:34:49

问题


I am trying to plot a number of graphs next to each other using grid.arrange. Specifically, I would like the plots to have a shared x axis label and a legend at the bottom. Here is the code I am using for the arrangement (working example here), sans the universal x axis:

plot.c <- grid.arrange(arrangeGrob(plot.3 + 
                                 theme(legend.position="none"),
                               plot.2 + theme(legend.position="none"),
                               plot.4 + theme(legend.position="none"),
                               nrow=1),
                   my.legend, 
                   main="Title goes here", 
                   left=textGrob("Y Axis", rot = 90, vjust = 1),
                   nrow=2,heights=c(10, 1))

The legend is a TableGrob object; the universal x axis should be a textGrob along the lines of

bottom=textGrob("X Axis")

However, if I add that to the code, the legend is moved to the right side. If I indicate that both legend and label should be at the bottom, one of them still moves to the right side. Thus the question, is there a way of combining a universal x axis label with a legend at the bottom?


回答1:


Had a similar issue so I came up with something like this.

library(ggplot2)
library(gtable)
library(gridExtra)

dsamp <- diamonds[sample(nrow(diamonds), 1000), ]
p1 <- qplot(price, carat, data=dsamp, colour=clarity) + theme(legend.position="none") + xlab("")
p2 <- qplot(price, cut, data=dsamp, colour=clarity) + theme(legend.position="none") + xlab("")
p3 <- qplot(price, color, data=dsamp, colour=clarity) + theme(legend.position="none") + xlab("")
p4 <- qplot(price, depth, data=dsamp, colour=clarity) + theme(legend.position="none") + xlab("")

legend <- gtable_filter(ggplot_gtable(ggplot_build(p1 + theme(legend.position="bottom"))), "guide-box")
lheight <- sum(legend$height)
p <- arrangeGrob(p1, p2, p3, p4, ncol=2)
theight <- unit(12, "points")
p <- arrangeGrob(p, textGrob("price", gp=gpar(fontsize=12)), heights=unit.c(unit(1, "npc") - theight, theight))
p <- arrangeGrob(p, legend, heights=unit.c(unit(1, "npc") - lheight, lheight), ncol=1)
print(p)



来源:https://stackoverflow.com/questions/24826658/universal-x-axis-label-and-legend-at-bottom-using-grid-arrange

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!