ggplot中表格与条形图尺寸不匹配,如何对齐标题?
解决表格与条形图并排对齐及尺寸匹配问题
要实现表格列标题与图表标题对齐、每行内容与条形一一匹配,核心是统一两者的布局参数(行高、边距、总高度),以下是修改后的实现方案:
关键调整思路
- 提取条形图面板高度,分配给表格每行,确保行高与条形高度完全匹配
- 调整图表标题的边距,与表格列标题的垂直位置对齐
- 统一两者的总高度和宽度比例,消除空白或尺寸错位
修改后的代码
data(mtcars) library(ggplot2) library(dplyr) library(grid) library(gridExtra) library(cowplot) library(gtable) data <- mtcars %>% select(mpg, disp, cyl, qsec) %>% tibble::rownames_to_column("Car Name") %>% slice(1:7) data$`Car Name` <- factor(data$`Car Name`, levels = data$`Car Name`) # 创建表格并调整行高,匹配条形图的条形高度 t <- tableGrob(data %>% select(-mpg), theme = ttheme_minimal( core = list(fg_params = list(hjust = 0.5), padding = unit(c(4, 4), "mm")), colhead = list(fg_params = list(hjust = 0.5), padding = unit(c(4, 4), "mm")) ), rows = NULL) # 计算条形图面板高度,分配为表格行高 p_temp <- ggplot(data, aes(x = mpg, y = `Car Name`)) + geom_bar(stat = "identity") + scale_y_discrete(limits=rev) p_grob <- ggplotGrob(p_temp) panel_height <- p_grob$heights[which(p_grob$layout$name == "panel")] row_height <- panel_height / nrow(data) t$heights[seq(2, nrow(t))] <- row_height # 创建条形图并调整标题位置,与表格列标题对齐 p <- ggplot(data, aes(x = mpg, y = `Car Name`)) + geom_bar(stat = "identity", fill = "white", color = "black", alpha = 0.3, size = .75) + theme_classic() + theme(axis.text.y = element_blank(), axis.title.y = element_blank(), axis.title.x = element_blank(), plot.title = element_text(face = "bold", margin = margin(b = 10)), plot.margin = margin(t = 10, r = 10, b = 10, l = 0)) + ggtitle("No. of mpg") + scale_x_continuous(expand = expansion(mult = c(0, .1)), limits = c(0,30)) + scale_y_discrete(limits=rev) # 统一表格与图表的总高度,并排展示 p_grob_final <- ggplotGrob(p) t$heights[1] <- p_grob_final$heights[1] # 匹配标题行高度 grid.arrange(t, p_grob_final, nrow = 1, widths = c(2, 1)) # 按需调整宽度比例
核心说明
- 行高匹配:通过
ggplotGrob提取条形图的面板高度,平均分配给表格的每一行,确保表格每行和对应条形高度完全一致 - 标题对齐:调整
plot.title的下边距,同时统一表格和图表的顶部边距,让图表标题与表格列标题处于同一垂直位置 - 尺寸优化:通过
widths参数设置表格与图表的宽度比例,避免空白过多或内容拥挤;统一两者的标题行高度,消除上下错位
内容的提问来源于stack exchange,提问作者AJPomp96
相关产品推荐
相关产品推荐

