如何设置gt::data_color的全局着色方向而非按行/列
如何让gt包的data_color基于全表数值进行着色?
问题描述
使用gt包的data_color()函数时,发现其direction参数仅支持"column"或"row"选项,但希望基于表格中所有数值字段的全局范围进行着色,而非仅按行或列计算。以下是可复现代码:
require(gt) n <- 5 set.seed(23) data.frame( product_name = sample(LETTERS,n), performance_1 = rnorm(n,-1,1), performance_2 = runif(n,-1,1), performance_3 = runif(n,-1,1), performance_4 = rnorm(n,0,1) ) |> gt::gt() |> data_color( columns = contains("performance"), direction = "row", # 希望替换为全表范围计算 fn = scales::col_numeric( palette = c("tomato","gold","green4"), domain = NULL ) )
也可使用以下dput数据复现:
structure(list(product_name = c("X", "S", "H", "K", "G"), performance_1 = c(-0.00339489316645392, 0.107490487448087, -1.27808628285053, 0.0192054876250842, -0.954562821242861 ), performance_2 = c(0.884923394303769, 0.256039271131158, 0.172795631922781, -0.450518076308072, -0.70468607544899), performance_3 = c(0.60282064601779, -0.227180351037532, 0.640901388134807, 0.36987454816699, 0.766778532415628 ), performance_4 = c(-1.21637642702189, 0.30813689628972, -0.52017831497405, -0.442313800737427, -0.599312811975944)), class = "data.frame", row.names = c(NA, -5L))
解决方案
不需要修改direction参数,而是通过手动指定scales::col_numeric()的domain参数为全表数值的全局范围,即可实现基于全表的着色逻辑。具体步骤如下:
- 先提取所有目标数值列的全局最小值和最大值;
- 将该范围传入
col_numeric()的domain参数,此时direction的设置会被忽略,颜色映射将基于全局范围计算。
修改后的代码如下:
require(gt) set.seed(23) n <- 5 df <- data.frame( product_name = sample(LETTERS,n), performance_1 = rnorm(n,-1,1), performance_2 = runif(n,-1,1), performance_3 = runif(n,-1,1), performance_4 = rnorm(n,0,1) ) # 计算所有performance列的全局最小/最大值 global_range <- range(df[, grepl("performance", names(df))]) df |> gt::gt() |> data_color( columns = contains("performance"), # direction可保留任意有效值,不影响最终着色逻辑 direction = "row", fn = scales::col_numeric( palette = c("tomato","gold","green4"), domain = global_range ) )
原理说明
当scales::col_numeric()的domain参数被显式指定时,函数会优先使用该固定范围进行颜色映射,而不会根据direction参数去计算行或列的局部范围。因此,即使direction设为"row"或"column",最终的着色依然会基于全表的数值范围生成。
内容的提问来源于stack exchange,提问作者Yann
相关产品推荐
相关产品推荐

