有没有一种优雅的方法来将tableGrob行与轴断点对齐?
我想在R中并排放置一个tableGrob和ggplot图表(我需要复制以前版本公共报告中使用的一些SAS输出)。像这个最小可重现示例:
这篇文章 帮了我很多——tableGrob与图表主体在同一gtable行中;但是,需要大量手动调整才能使tableGrob中的行与轴标签对齐。
我还发现了这篇文章。由于我正在编写公共报告,我希望不使用不容易在CRAN包中获得的代码。话虽如此,tableGrob的实验版本似乎接受高度作为参数。如果这段代码可以解决问题,并且我选择使用这个实验版本,那么我该如何计算适当的行高?
如果没有更优雅的方法,我发现以下技巧很有用:
- 将tableGrob中的字体大小和cex设置为与ggplot2相匹配
- 将padding.v设置为在tableGrob中间隔表格行
- 修改坐标限制以适应列标签并与最后一行底部对齐
我的MRE代码:
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()
为了排除故障,我在y轴的间断处保留了汽车名称,但最终我会将它们删除。
unit(1/n, "npc")
。 - baptiste