使用R的gt包为数据框按值范围着色的问题及解决方案
使用gt包为数据框按指定值范围着色的问题与解决方案
问题说明
需要为包含a和b列的数据框df按以下规则着色:
- 值低于11时显示绿色
- 11到15之间(含边界)显示绿色到红色的渐变
- 值高于15时显示红色
尝试了以下代码,但未达到预期效果:
library(gt) library(dplyr) df <- data.frame(a = 1:21, b = rep(10:30)) df %>% gt() %>% gt::data_color( colors = scales::col_numeric( # na.color = "green", palette = c("green", "red"), domain = c(11, 15) ) )
核心问题:如果启用na.color = "green"参数,会导致高于15的值也被染成绿色,不符合需求。
解决方案
感谢@mael提供的可行方案,通过自定义调色函数实现分区间精准着色:
pal <- function(x, bin = c(11,15), palette = c("green", "red")) { # 低于11的区间:纯色绿色 f1 <- scales::col_bin( palette = palette[1], bin = c(-Inf, bin[1]) ) # 11到15的区间:绿色到红色渐变 f2 <- scales::col_numeric( palette = palette, domain = c(bin[1], bin[2]) ) # 高于15的区间:纯色红色 f3 <- scales::col_bin( palette = palette[2], bin = c(bin[2], Inf) ) dplyr::case_when( x < bin[1] ~ f1(x), x < bin[2] ~ f2(x), TRUE ~ f3(x) ) } df %>% gt() %>% gt::data_color(fn = pal)
该函数通过case_when为不同数值区间分配对应的着色逻辑:
- 低于11的值调用
col_bin返回纯色绿色 - 11到15之间的值调用
col_numeric生成渐变色彩 - 高于15的值调用
col_bin返回纯色红色
内容的提问来源于stack exchange,提问作者Vincent Guyader
相关产品推荐
相关产品推荐

