为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
相关产品推荐
相关产品推荐

