You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

RMarkdown中ggplot与表格并排:兼容HTML/PDF及grid.arrange失效原因

在RMarkdown中实现ggplot图形与表格并排并兼容HTML和PDF输出

问题描述

需要在RMarkdown中实现ggplot图形与表格并排显示,且同时兼容HTML和PDF输出:

  • 用内嵌CSS的row/col-md-6方法仅在HTML中生效,PDF中图形与表格无法同行
  • 使用grid.arrange方法在两种输出中均失效

grid.arrange失效的原因

  1. results='asis'参数冲突:该参数会让knitr直接输出文本内容,而grid.arrange生成的是图形对象,无法被正确渲染,最终只会输出对象的文本描述而非可视化内容。
  2. tableGrob参数类型错误:kable_styling()返回的是HTML格式的表格代码,并非原生表格数据结构,tableGrob无法解析这种HTML字符串,需要传入原始的data.frame或原生表格对象。

兼容HTML和PDF的解决方案

方法1:分格式条件渲染

利用knitr::is_html_output()判断输出格式,HTML用Bootstrap布局,PDF用LaTeX的minipage环境:

---
title: "ggplot与表格并排测试"
author: "me"
output:
  html_document:
    toc: true
  pdf_document:
    toc: true
---
knitr::opts_chunk$set(echo = FALSE, warning=FALSE, message=FALSE)
library(kableExtra)
library(gridExtra)
library(ggplot2)
n <- 100
adf <- data.frame(X=rnorm(n),Y=rnorm(n,1), Z=rnorm(n,2))
for( coln in names(adf)){
  cat("\n\n## ", coln, "\n\n")
  coldat <- adf[[coln]]
  tdf <- data.frame(min=min(coldat), max=max(coldat))
  
  p <- ggplot(data=adf,aes(x=.data[[coln]])) + geom_histogram()
  
  if(knitr::is_html_output()){
    # HTML用Bootstrap响应式布局
    cat("\n<div class=\"row\">\n")
    cat("\n<div class=\"col-md-6\">\n")
    print(p)
    cat("\n</div>\n")
    
    t1 <- kable(tdf) %>% kable_styling()
    cat("\n<div class=\"col-md-6\">\n")
    print(t1)
    cat("\n</div>\n")
    cat("\n</div>\n")
  } else {
    # PDF用LaTeX minipage实现同行
    cat("\\begin{minipage}{0.48\\linewidth}\n")
    print(p)
    cat("\\end{minipage}%")
    cat("\\begin{minipage}{0.48\\linewidth}\n")
    print(kable(tdf, format = "latex") %>% kable_styling(latex_options = "hold_position"))
    cat("\\end{minipage}\n")
  }
}

方法2:统一用gridExtra渲染

去掉results='asis'参数,直接传入原始数据框生成tableGrob,确保跨格式兼容:

for( coln in names(adf)){
  cat("\n\n## ", coln, "\n\n")
  coldat <- adf[[coln]]
  tdf <- data.frame(min=min(coldat), max=max(coldat))
  
  p <- ggplot(data=adf,aes(x=.data[[coln]])) + geom_histogram()
  
  # 用原始data.frame生成表格图形对象
  table_grob <- tableGrob(tdf, theme = ttheme_minimal())
  grid.arrange(p, table_grob, ncol = 2, widths = c(0.6, 0.4))
}

效果说明

  • 方法1的HTML输出保留响应式布局,PDF通过LaTeX环境实现精准同行对齐,表格样式可通过kableExtra灵活调整
  • 方法2输出风格统一,在两种格式中均能实现并排,但表格样式需通过tableGrob的主题参数调整,灵活性稍弱

内容的提问来源于stack exchange,提问作者PM.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 10:34:50