如何让gt表格gt_color_box中的NA值显示为空白或白色?
解决gtExtras中
gt_color_box函数NA值颜色不生效的问题 问题概述
使用gtExtras::gt_color_box时,指定na.color = "#FFFFFF"无法将NA值的背景色改为白色,所有NA仍显示默认灰色;同时希望超出domain范围的值也能应用指定颜色,不想通过将NA转0的繁琐方式处理。
原因分析
查看gt_color_box的源码可知,该函数封装了gt::data_color,但可能存在参数传递遗漏,或是gt_theme_espn主题的CSS样式覆盖了NA单元格的背景色设置,导致na.color参数失效。
解决方案:直接通过tab_style自定义NA单元格样式
利用gt包的tab_style函数,直接为所有NA单元格(或超出domain后转为NA的单元格)设置白色背景,不受主题或gt_color_box的限制。
完整代码示例
library(tidyverse) library(gt) library(gtExtras) df <- data.frame( name = c("Jared Jones", "Corbin Burnes", "Freddy Peralta", "Zack Wheeler", "Zach Eflin", "George Kirby", "Logan Webb", "Tanner Houck", "Grayson Rodriguez", "Brandon Pfaadt"), ip = c(23, 23.2, 17.2,24, 23.1, 20.1, 30.2, 26.2, 24, 23.2), fastball = c(148.9, NA, 138.6, 93.5, 63, 102, 57.8, 24.3, 111.3, 73.9), sinker = c(NA,119.8, NA, 100.6, 95.4, 100.3, 97.5, 104.6, 111.4, 93.6), cutter = c(NA, 127.7, NA, 83.7, 84, NA, NA, 99.8, 91.6, NA), splitter = c(NA,NA, NA, 92.3, NA, 91.6, NA, 98.8, NA, NA), slider = c(126.8,106.6, 102.7, 124.3, 133.8, 109, 111.8, 117.5, NA, 131.3), curve = c(109.7,105, 85.6, 103.7, 108.8, 117.9, NA, NA, 109.9, 91), changeup = c(139.3,118.7, 53.7, NA, 69.5, NA, 138.1, NA, 136.9, 89) ) # 定义需要处理的统计列 stat_cols <- c("fastball", "sinker", "cutter", "splitter", "slider", "curve", "changeup") # 处理超出domain范围的值,转为NA(可选,若需要统一处理超出范围和NA的颜色) df_processed <- df %>% mutate( fastball = ifelse(fastball < 20 | fastball > 200, NA, fastball), sinker = ifelse(sinker < 10 | sinker > 200, NA, sinker), cutter = ifelse(cutter < 80 | cutter > 140, NA, cutter), splitter = ifelse(splitter < 10 | splitter > 200, NA, splitter), slider = ifelse(slider < 80 | slider > 140, NA, slider), curve = ifelse(curve < 80 | curve > 120, NA, curve), changeup = ifelse(changeup < 10 | changeup > 160, NA, changeup) ) df_processed %>% gt() %>% gt_theme_espn() %>% cols_align(align = "center", columns = stat_cols) %>% gt_color_box(columns = fastball, domain = 20:200, palette = "ggsci::blue_material") %>% gt_color_box(columns = sinker, domain = 10:200, palette = "ggsci::red_material") %>% gt_color_box(columns = cutter, domain = 80:140, palette = "ggsci::pink_material") %>% gt_color_box(columns = splitter, domain = 10:200, palette = "ggsci::green_material") %>% gt_color_box(columns = slider, domain = 80:140, palette = "ggsci::teal_material") %>% gt_color_box(columns = curve, domain = 80:120, palette = "ggsci::purple_material") %>% gt_color_box(columns = changeup, domain = 10:160, palette = "ggsci::orange_material") %>% # 为每列的NA单元格设置白色背景 walk(stat_cols, ~{ tab_style( style = cell_fill(color = "#FFFFFF"), locations = cells_body(columns = .x, rows = is.na(.data[[.x]])) ) }) %>% tab_header(title = 'Pitcher Stuff+ Rankings') %>% tab_source_note(source_note = 'Data: FanGraphs')
说明
- 若不需要处理超出
domain的值,可跳过df_processed的步骤,直接对原始df应用tab_style。 - 使用
walk遍历所有统计列,避免重复编写tab_style代码,提升效率。 - 这种方法直接针对HTML单元格设置样式,不会被主题或
gt_color_box的默认样式覆盖。
内容的提问来源于stack exchange,提问作者Violin125
相关产品推荐
相关产品推荐

