R Markdown中按数据行数自动设置绘图高度匹配相邻表格高度
R Markdown 图表与表格并排自动对齐方案
问题场景
在输出html_document格式的R Markdown文档时,常通过Bootstrap栅格类实现左右分栏:
- 右侧3/12宽度栏放置gt生成的带链接数据表格
- 左侧9/12宽度栏放置ggplot2生成的横向散点图
原有方案手动指定fig.height参数调整绘图高度,面对行数动态更新的业务数据时,调整效率低,也无法实现gt表格行与ggplot y轴标签的精准对齐。
原初始配置
--- title: "document" author: "Maral Dorri" date: 'May 2022' output: html_document ---
自动对齐实现方案
核心逻辑是以数据行数为唯一动态变量,固定单行高度、边距为可微调的常量,自动计算绘图总高度,同时统一表格和图表的间距参数,无需每次手动调整。
步骤1:初始化配置与基准参数
在文档开头的setup代码块中加载依赖包,定义对齐用的固定常量:
library(tidyverse) library(gt) # 对齐基准参数,可根据自身显示需求微调 single_row_height <- 0.35 # 单行数据对应的绘图高度(单位:英寸) plot_padding <- 0.6 # 图表上下边距,与ggplot主题中margin参数保持一致
步骤2:数据处理与图高自动计算
处理数据时,直接基于数据行数自动计算适配的绘图高度,不需要硬编码数值:
raw_dat <- mtcars[1:15, ] %>% rownames_to_column(var = "id") %>% select(id, mpg) # 自动计算适配的绘图高度:所有行总高度 + 上下边距 dynamic_fig_height <- nrow(raw_dat) * single_row_height + plot_padding
步骤3:分栏布局代码
栅格布局结构和原有逻辑一致,做两处调整即可:
- 给gt表格添加
tab_options配置,统一行高、上下边距和图表对齐 - ggplot代码块的
fig.height参数通过内联R代码传入动态计算的高度值,同时微调坐标轴边距适配
<div class = "row"> <div class = "col-md-3">
tibble( name = raw_dat$id, link = paste(raw_dat$mpg, "And <a href = 'https://www.cars.com//'>here</a>")) %>% mutate(link = map(link, gt::html)) %>% gt() %>% tab_options( data_row.padding = px(8), table.margin.top = px(23), table.margin.bottom = px(23) )
</div> <div class = "col-md-9">
```{r ggplot-fig, fig.height=r dynamic_fig_height}
ggplot(raw_dat, aes(factor(id, rev(id)), mpg)) +
geom_point() +
coord_flip() +
scale_y_continuous(expand = expansion(add = c(0.5, 0.5))) +
theme(plot.margin = margin(plot_padding, unit = "cm"))
```html </div> </div>
微调说明:如果修改了gt表格字体大小、ggplot主题样式,只需要调整开头定义的
single_row_height和边距常量即可,后续业务数据行数更新时无需任何手动调整,会自动实现表格行与y轴标签的一一精准对齐。
内容的提问来源于stack exchange,提问作者Maral Dorri
相关产品推荐
相关产品推荐

