Juxtapose tableGrob with ggplot2 y-axis
ggplot2, gridextra, gtable, r
Solution
There's now this experimental version of gtable_table
table <- gtable_table(df[,c("mpg","cyl","disp","cars")],
heights = unit(rep(1,nrow(df)), "null"))
g <- ggplotGrob(p)
g <- gtable_add_cols(g, sum(table$widths), 0)
g <- gtable_add_grob(g, table, t=3, b=3, l=1, r=1)
grid.newpage()
grid.draw(g)
Problem
Is there an elegant way to align the tableGrob rows with the axis breaks? I would like to juxtapose a tableGrob and ggplot chart in R (I need to reproduce some SAS output used in previous versions of a public report). Like this minimal reproducible example: This post got me pretty far --- the tableGrob is in the same gtable row as the body of the chart; however, it requires lots of manual fiddling to get the rows in the tableGrob to line up with the axis labels. I also found this post. Since I'm Sweaving a public report, I would prefer not to use code that isn't readily available in a package on CRAN. That being said, the experimental version of tableGrob appears to accept heights as an argument. If this code will do the trick, and I do choose to use this experimental version, how would I calculate the appropriate row heights? If there is not an elegant way of doing this, I found these tricks to be helpful: - set fontsize AND cex in tableGrob to match ggplot2 - set padding.v to space table rows in tableGrob - modify coordinate limits to accomodate column labels and align with bottom of last row My MRE code: ``` library(ggplot2) library(gridExtra) library(gtable) theme_set(theme_bw(base_size = 8)) df <- head(mtcars,10) df$cars <- row.names(df) df$cars <- factor(df$cars, levels=df$cars[order(df$disp, decreasing=TRUE)], ordered=TRUE) p <- ggplot(data=df, aes(x=hp, y=cars)) + geom_point(aes(x=hp, y=cars)) + scale_y_discrete(limits=levels(df$cars))+ theme(axis.title.y = element_blank()) + coord_cartesian(ylim=c(0.5,length(df$cars)+1.5)) t <- tableGrob(df[,c("mpg","cyl","disp","cars")], cols=c("mpg","cyl","disp","cars"), gpar.coretext = gpar(fontsize = 8, lineheight = 1, cex = 0.8), gpar.coltext = gpar(fontsize = 8, lineheight = 1, cex = 0.8), show.rownames = FALSE, show.colnames = TRUE, equal.height = TRUE, padding.v = unit(1.65, "mm")) g <- NULL g <- ggplotGrob(p) g <- gtable_add_cols(g, unit(2,"in"), 0) g <- gtable_add_grob(g, t, t=3, b=3, l=1, r=1) png('./a.png', width = 5, height = 2, units = "in", res = 100) grid.draw(g) dev.off() ``` I have left the car names on the y-axis breaks for troubleshooting purposes, but ultimately I will remove them.