如何用RMarkdown实现类纯LaTeX格式的混淆矩阵展示?
在RMarkdown中实现带单元格合并的LaTeX风格混淆矩阵
以下是几种优雅高效的解决方案,覆盖不同输出场景:
方案1:kableExtra + LaTeX multirow命令(PDF专属)
如果你的RMarkdown仅需输出PDF,可以直接利用LaTeX的multirow命令,结合kableExtra实现完美的单元格合并效果:
library(kableExtra) # 构造混淆矩阵数据 conf_mat <- matrix(c(85, 5, 3, 87), nrow = 2, byrow = TRUE) colnames(conf_mat) <- c("预测正类", "预测负类") # 为行名添加multirow命令,实现行合并 rownames(conf_mat) <- c("\\multirow{2}{*}{实际正类}", "实际负类") # 定义表头分组(合并预测类别列) header_group <- c("", "预测类别" = 2) # 生成表格 kable(conf_mat, format = "latex", booktabs = TRUE, escape = FALSE, caption = "混淆矩阵") %>% add_header_above(header_group) %>% column_spec(1, width = "2cm") %>% # 调整边框样式,让合并行的边框更美观 row_spec(1, border_bottom = FALSE) %>% row_spec(2, border_top = TRUE) %>% row_spec(0, bold = TRUE)
关键说明:escape = FALSE允许表格解析LaTeX命令,multirow{2}{*}{内容}实现将指定单元格跨行合并2行。
方案2:gt包(多格式兼容:HTML/PDF/Word)
若需要同时兼容多种输出格式(如HTML、PDF甚至Word),gt包提供了无需依赖LaTeX的单元格合并能力:
library(gt) library(tibble) # 构造带分组的混淆矩阵数据框 conf_df <- tibble( 实际类别 = c("实际正类", "实际正类", "实际负类", "实际负类"), 预测类别 = c("预测正类", "预测负类", "预测正类", "预测负类"), 数量 = c(85, 5, 3, 87) ) # 生成带合并效果的表格 gt(conf_df) %>% # 按实际类别分组,实现行合并 tab_row_group(group = "实际正类", rows = 1:2) %>% tab_row_group(group = "实际负类", rows = 3:4) %>% # 合并预测类别相关列的表头 tab_spanner(label = "预测类别", columns = c(预测类别, 数量)) %>% # 隐藏原始实际类别列,用分组标题替代 cols_hide(columns = 实际类别) %>% # 调整样式,贴近LaTeX风格 tab_options( row_group.font.weight = "bold", table.border.top.style = "solid", table.border.bottom.style = "solid", heading.border.bottom.style = "solid" ) %>% tab_header(title = "混淆矩阵")
该方案无需额外LaTeX环境,输出格式灵活,样式可自定义程度高。
方案3:直接嵌入LaTeX代码(PDF专属)
如果追求完全和纯LaTeX一致的效果,可直接在RMarkdown中插入LaTeX表格代码:
\begin{table}[ht] \centering \caption{混淆矩阵} \begin{tabular}{llcc} \toprule & & \multicolumn{2}{c}{预测类别} \\ \cmidrule(lr){3-4} & & 预测正类 & 预测负类 \\ \midrule \multirow{2}{*}{实际类别} & 实际正类 & 85 & 5 \\ & 实际负类 & 3 & 87 \\ \bottomrule \end{tabular} \end{table}
此方法完全复用LaTeX的排版能力,适合对格式有极致要求的场景。
内容的提问来源于stack exchange,提问作者John Stone
相关产品推荐
相关产品推荐

