You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为as_grouped_data格式的flextable相同值单元格着色并规避深色

解决flextable中过暗背景色导致文字不可读的问题

问题场景

在使用as_grouped_data()对数据分组后,通过flextable的bg()函数为B列值相同的单元格设置随机背景色时,sample(colors())会随机选中黑色等过暗颜色,导致单元格文字难以辨识。


解决方案

以下三种方法可筛选出亮度充足的浅色,避免文字可读性问题:

方法1:筛选R内置颜色中的浅色

通过grDevices::rgb2hsv()提取颜色的亮度通道(V值),只保留亮度高于阈值的颜色:

library(dplyr)
library(flextable)
library(grDevices)

dat <- data.frame(
  stringsAsFactors = FALSE,
  A = c("NHH","NHH","NHH","NHH",
        "NHH","NHH","NHH","NHH","NHH","cUU","cUU","cUU",
        "cUU","cUU","cUU","cUU","cUU","cUU","cUU","cUU","cUU",
        "cUU","cUU","cUU","cUU","cUU","cUU","cUU"),
  B = c("uJc","GBY","rYv","hYl",
        "hat","hqL","jxF","hqL","VMg","gWX","Vae","uJc",
        "GBY","Vae","hYl","uJc","pEI","gWX","ZCY","ZCY","Vae",
        "Vae","rYQ","veT","hqL","Vae","hYl","QIN")
)%>% as_grouped_data(., groups = "A")

# 筛选亮度V值>0.7的浅色
all_colors <- colors()
color_hsv <- rgb2hsv(col2rgb(all_colors))
light_colors <- all_colors[color_hsv["v", ] > 0.7]

cid <- consecutive_id(dat$B)
cols <- sample(light_colors, size = length(unique(cid)))
mycolors <- cols[cid]

flextable(dat) |>
  bg(i = 1:nrow(dat), j = 'B', bg = mycolors, part = 'body')

方法2:使用viridis调色板

viridis包提供的调色板均为对视觉友好的亮色,无过暗颜色,且色彩区分度高:

library(dplyr)
library(flextable)
library(viridis)

dat <- data.frame(
  stringsAsFactors = FALSE,
  A = c("NHH","NHH","NHH","NHH",
        "NHH","NHH","NHH","NHH","NHH","cUU","cUU","cUU",
        "cUU","cUU","cUU","cUU","cUU","cUU","cUU","cUU","cUU",
        "cUU","cUU","cUU","cUU","cUU","cUU","cUU"),
  B = c("uJc","GBY","rYv","hYl",
        "hat","hqL","jxF","hqL","VMg","gWX","Vae","uJc",
        "GBY","Vae","hYl","uJc","pEI","gWX","ZCY","ZCY","Vae",
        "Vae","rYQ","veT","hqL","Vae","hYl","QIN")
)%>% as_grouped_data(., groups = "A")

cid <- consecutive_id(dat$B)
# 从viridis调色板生成颜色,option可选"viridis"/"plasma"/"cividis"等
cols <- viridis(length(unique(cid)), option = "plasma")
mycolors <- cols[cid]

flextable(dat) |>
  bg(i = 1:nrow(dat), j = 'B', bg = mycolors, part = 'body')

方法3:自定义浅色集合

手动指定一组不会过暗的浅色,确保文字清晰可读:

library(dplyr)
library(flextable)

dat <- data.frame(
  stringsAsFactors = FALSE,
  A = c("NHH","NHH","NHH","NHH",
        "NHH","NHH","NHH","NHH","NHH","cUU","cUU","cUU",
        "cUU","cUU","cUU","cUU","cUU","cUU","cUU","cUU","cUU",
        "cUU","cUU","cUU","cUU","cUU","cUU","cUU"),
  B = c("uJc","GBY","rYv","hYl",
        "hat","hqL","jxF","hqL","VMg","gWX","Vae","uJc",
        "GBY","Vae","hYl","uJc","pEI","gWX","ZCY","ZCY","Vae",
        "Vae","rYQ","veT","hqL","Vae","hYl","QIN")
)%>% as_grouped_data(., groups = "A")

# 自定义浅色调色板
light_palette <- c("#F8F3E6", "#E8F4F8", "#F5E8E4", "#E8F8E8", 
                   "#F8E8F8", "#E4E8F8", "#F8F0E4", "#E4F8F0")

cid <- consecutive_id(dat$B)
# 数量不足时允许重复采样
cols <- sample(light_palette, size = length(unique(cid)), replace = TRUE)
mycolors <- cols[cid]

flextable(dat) |>
  bg(i = 1:nrow(dat), j = 'B', bg = mycolors, part = 'body')

内容的提问来源于stack exchange,提问作者12666727b9

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 00:07:41