在R的gt包中为颜色渐变设置断点的实现求助
使用gt包实现定制化色彩映射的表格
原代码直接采用默认值域的viridis配色,没有适配数据分布特征,导致常规正数区间色彩压缩、极高值无法突出,最终表格色彩区分度不足。以下是针对需求的解决方案:
1. 先明确数据分布特征
先合并两列数据查看极值与分位数,确定分段边界:
library(gt) library(scales) library(dplyr) # 加载数据 test <- structure(list(Delta_p = c(-19.98, 51.22, NA, 57.61, -17.01, 27.76, NA, 43.7, 25.75, NA, NA, 28.72, NA, 52.07, 45.12, NA, -41.56, -16.81, 14.35, -20.09, -35.17, NA, 23.91, 54.09, NA, NA, 10.53, NA, 28.97, 36.76, -11.25, 48.61, 99.01, -20, 137.5, NA, 29.19, 26.71, -29.74, -18, 57.66, -41.91, 25.5, 29.01, 12.47, NA, 22.19, -52.42, 19.01, 32.71, 43.39, NA, 123.88, 76.71, 45.96, 105.85, 47.71, 51.72, NA, 43.7, -38.04, -25.05, 45.96, NA, 71.93, 12.77, NA, -33.59, 577.78, 52.2, 24.44, 27.06, 127.27, -35.53, -21.34, NA, 8.33, 22.46, 27.65, 93.1, 37.87, 58.9, -19.67, -25.53, -24.35, 27.21, NA, -57.4, 16.62, 16.48, 14.71, 24.81, -30.33, 40.79, 45.02, 70.13, 68.65, 29.6, 13.28, -11.87), Delta_n = c(32.25, NA, -20.49, 43.61, -22.97, 26.87, 46.58, 28.69, 46.56, 94.12, 36.67, 96.05, 50.15, 59.35, 24.95, 47.93, NA, NA, 28.26, 59.56, -17.03, 89.47, -26.11, 35.5, 29.76, 69.09, NA, 27.75, -13.47, 43.58, NA, 72.22, 52.28, -24.95, NA, -16.4, 65.49, 51.58, 23.94, -19.1, -21.1, 70.97, NA, -26.96, 22.39, -21.74, 20.47, 27.33, 41.44, 24.69, 32.33, 68.16, -23.7, NA, -19.9, NA, NA, -19.9, -19.71, 24.91, NA, 24.85, 30.38, 23.72, 89.67, NA, 69.05, NA, NA, 35.07, 37.39, -32.13, 90.91, 28.08, -13.34, 24.23, -20.49, NA, -15.04, 100.86, NA, NA, -18.1, 16.85, NA, 18.38, 276.83, 22.82, 36, -9.78, NA, 20.83, NA, 21.54, 52.36, -23.95, NA, 12.74, NA, 20.36)), row.names = c(2117L, 2609L, 200L, 340L, 1576L, 1353L, 1710L, 832L, 1530L, 895L, 1980L, 92L, 273L, 884L, 1784L, 452L, 2610L, 2109L, 733L, 261L, 2277L, 1447L, 1588L, 1803L, 1989L, 275L, 2192L, 2500L, 1876L, 2077L, 1637L, 2536L, 971L, 2596L, 283L, 360L, 1316L, 83L, 1310L, 2000L, 529L, 2201L, 2189L, 563L, 1486L, 487L, 2046L, 97L, 98L, 1554L, 1769L, 2318L, 782L, 1845L, 196L, 802L, 2414L, 198L, 1712L, 2220L, 1201L, 2480L, 2491L, 2237L, 2539L, 2207L, 2537L, 1432L, 73L, 730L, 2477L, 582L, 1209L, 2291L, 2336L, 737L, 1853L, 2409L, 1281L, 426L, 1054L, 1205L, 566L, 1299L, 129L, 2069L, 948L, 846L, 1723L, 1148L, 208L, 490L, 2269L, 6L, 1187L, 1184L, 2091L, 2143L, 1439L, 1703L), class = "data.frame") # 合并两列分析分布 combined_vals <- c(test$Delta_p, test$Delta_n) summary(combined_vals) quantile(combined_vals, c(0.01, 0.95, 0.99), na.rm = TRUE)
从结果可知:多数数值集中在-60到500,极高值(如577、276)属于少数异常值,以此为依据设置分段规则。
2. 定制色彩映射函数
基于数据分布实现分段色彩逻辑:
# 定义分段边界 neg_min <- min(combined_vals, na.rm = TRUE) pos_regular_max <- 500 # 定制色彩映射逻辑 custom_pal <- function(x) { case_when( # 极高值用特殊高亮色 x > pos_regular_max ~ "#9B1F63", # 正数区间:0到500,用magma暖色调渐变 x > 0 ~ col_numeric("magma", domain = c(0, pos_regular_max))(x), # 0值固定白色 x == 0 ~ "#FFFFFF", # 负数区间:从最小值到0,用viridis冷色调渐变(反转后接近0时过渡到白色) x < 0 ~ col_numeric("viridis", domain = c(neg_min, 0), reverse = TRUE)(x), # NA值保留灰色 is.na(x) ~ "#808080" ) }
3. 生成带定制色彩的gt表格
gt(test) %>% data_color( columns = c(Delta_p, Delta_n), colors = custom_pal, legend_title = "数值区间" ) %>% # 可选:优化表格视觉样式 tab_options( table.background.color = "#F5F5F5", column_labels.font.weight = "bold", heading.title.font.size = 16 ) %>% tab_header(title = "Delta_p & Delta_n 数值分布表")
核心优化说明
- 分段映射:拆分常规正数与极高值区间,避免极高值压缩常规区间的色彩区分度
- 色彩逻辑:负数用viridis冷色调、正数用magma暖色调,0值作为冷暖分界的白色,视觉逻辑清晰
- 异常值高亮:超过500的极高值用统一深紫红色,快速识别特殊数据
内容的提问来源于stack exchange,提问作者Essi
相关产品推荐
相关产品推荐

