如何制作带标准化系数可视化的多模型表格(含p值处理)
解决方案:用gt+ggplot2实现系数可视化表格
核心思路
利用gt的自定义单元格渲染能力,结合ggplot2绘制对应大小和深浅的圆点,同时根据p值过滤不显著的单元格,完美匹配你要的corrplot风格效果。
步骤与代码示例
1. 匹配你的数据结构(模拟modelsummary输出)
假设你已经用modelsummary提取了系数和p值,这里模拟同结构的数据方便演示:
library(dplyr) library(modelsummary) library(gt) library(ggplot2) library(purrr) # 模拟3个模型的标准化系数与p值 set.seed(123) model_raw <- tibble( term = rep(c("Var1", "Var2", "Var3", "Var4"), 3), model = rep(c("Model 1", "Model 2", "Model 3"), each = 4), std_coef = c(rnorm(3, 0.2, 0.1), rnorm(1, 0.02, 0.01), rnorm(2, -0.3, 0.15), rnorm(2, 0.05, 0.03), rnorm(4, 0.15, 0.08)), p_value = c(runif(3, 0.01, 0.04), runif(1, 0.6, 0.8), runif(2, 0.02, 0.05), runif(2, 0.5, 0.7), runif(3, 0.01, 0.03), runif(1, 0.65, 0.9)) ) # 转成modelsummary默认的宽格式(系数表) coef_wide <- model_raw %>% select(-p_value) %>% pivot_wider(names_from = model, values_from = std_coef) # 单独提取p值的宽格式,用于判断显著性 p_wide <- model_raw %>% select(-std_coef) %>% pivot_wider(names_from = model, values_from = p_value)
2. 自定义圆点渲染函数
这个函数负责根据系数大小生成对应样式的圆点,同时处理不显著的情况:
plot_coef_dot <- function(coef, p_val) { # p>0.05时返回空白图 if (p_val > 0.05) { return(ggplot() + theme_void()) } # 系数绝对值越大,圆点越大、颜色越深 dot_size <- abs(coef) * 20 # 可自行调整缩放比例 dot_color <- scales::alpha("#2c3e50", abs(coef)) # 单色深浅控制 ggplot() + geom_point(aes(x = 1, y = 1), size = dot_size, color = dot_color) + theme_void() + theme(plot.margin = margin(0, 0, 0, 0, "pt")) }
3. 构建可视化表格
把函数应用到gt表格的每个单元格:
final_table <- coef_wide %>% gt(rowname_col = "term") %>% # 对所有模型列应用自定义渲染 text_transform( locations = cells_body(columns = starts_with("Model")), fn = function(x, col) { # 获取当前列对应的p值 p_vals <- p_wide[[col]] # 逐单元格生成圆点图 map2(x, p_vals, ~plot_coef_dot(as.numeric(.x), .y)) } ) %>% # 表格美化 tab_header(title = "多模型标准化系数可视化") %>% cols_label( `Model 1` = "模型1", `Model 2` = "模型2", `Model 3` = "模型3" ) %>% opt_table_lines(extent = "none") %>% opt_row_striping() # 输出表格 final_table
关键调整点
- 若要修改圆点颜色,直接替换
dot_color里的十六进制色值即可。 - 调整圆点大小的缩放比例,修改
dot_size的乘数(比如改成25会让圆点更大)。 - 如果你已有
modelsummary生成的完整数据,只需把coef_wide和p_wide替换成你的数据框(注意要单独提取系数和p值两部分)。
内容的提问来源于stack exchange,提问作者tci
相关产品推荐
相关产品推荐

