gt包列按值域渐变填充:实现灰到红、灰到绿的色彩映射
实现方案
你需要改用gt自带的data_color()函数完成渐变映射,原有代码报错是因为scales::col_bin()的参数顺序颠倒,且手动拆分区间的方式无法支持连续渐变效果。
完整可运行代码
library(gt) library(tidyverse) library(scales) # 示例测试数据,可替换为你的实际数据 df <- tibble( name = paste0("项目", 1:10), performance = runif(10, 50, 100), value = runif(10, 0, 1), threshold = rep(0.5, 10) # 阈值支持每行设置不同值 ) logistic_pattern <- function(x, thresholds) { sigma <- 0.2 y <- 1/(1+exp(-(x - thresholds)/sigma)) return(y) } gt(df) %>% data_color( columns = c(name, performance), rows = everything(), fn = function(x) { # 先对数值做logistic转换 trans_vals <- map2_dbl(df$value, df$threshold, ~logistic_pattern(.x, .y)) # 定义红-灰-绿三色渐变板,对应转换后0-1的值域区间 colorRampPalette(c("red", "gray85", "green"))(100)[cut(trans_vals, breaks = 100)] } )
关键修改说明
- 直接在
data_color的自定义函数中完成数值转换到颜色映射的全流程,无需拆分多个tab_style规则 - 原来报错的
scales::col_bin调用是因为参数顺序错误:正确顺序是先传调色板,再传值域范围,你之前把两个参数写反了才触发维度不匹配报错 - 支持每行设置不同的阈值,适配更复杂的场景
- 渐变精度可通过修改
colorRampPalette的参数(示例中为100)调整,数值越大渐变越平滑

内容的提问来源于stack exchange,提问作者Captain Tyler
相关产品推荐
相关产品推荐

