R中堆叠面积图24+高辨识度美观配色方案咨询
嘿,我太懂你这种需求了——要给堆叠面积图找24种以上、既高辨识度又好看的配色,viridis虽然对色觉障碍友好但数量不够,渐变又完全不适用,之前搜的方案也没戳中痛点。我这儿有几个亲测好用的方法,你可以挨个试试:
方法1:用colorspace包生成高区分度离散配色
colorspace包是生成大量离散配色的神器,它的定性调色板专门为多类别可视化设计,能保证颜色之间的区分度,还能兼顾色觉障碍人群。
library(colorspace) # 生成30种高区分度的离散颜色,可选不同风格的调色板 # Dynamic风格色彩鲜明,适合堆叠面积图 my_colors <- qualitative_hcl(30, palette = "Dynamic") # 要是喜欢柔和一点的风格,可以用Pastel1 # my_colors <- qualitative_hcl(30, palette = "Pastel1") # 预览颜色 scales::show_col(my_colors)
这个方法的优势是可以直接生成50种甚至更多的颜色,而且每个颜色的区分度都经过优化,不会出现“撞色”或者难以分辨的情况。
方法2:组合多个专业调色板(ggsci + RColorBrewer)
很多单调色板的颜色数量有限,但把风格相近的多个调色板组合起来,就能轻松凑够24+的数量,还能保证整体美观度。
library(ggsci) library(RColorBrewer) library(scales) # 从ggsci中取科研风的调色板,每个取10种 pal_npg <- pal_npg()(10) pal_aaas <- pal_aaas()(10) pal_jco <- pal_jco()(10) # 从RColorBrewer中取高区分度的离散调色板 pal_set2 <- brewer.pal(8, "Set2") pal_pastel1 <- brewer.pal(9, "Pastel1") # 合并调色板,去重后取前40种(按需调整数量) combined_colors <- unique(c(pal_npg, pal_aaas, pal_jco, pal_set2, pal_pastel1)) final_colors <- combined_colors[1:40] # 预览效果 show_col(final_colors)
组合的时候尽量选风格统一的调色板,比如ggsci的几个科研风调色板,和RColorBrewer的Set2、Pastel1搭配,整体不会太突兀,而且每个调色板内部的颜色已经是高区分度的,组合后效果也不错。
方法3:自定义HSV空间生成离散配色
直接在HSV颜色空间生成颜色,通过控制色相的均匀分布,保证颜色之间的区分度,还能自定义饱和度和明度来调整美观度。
# 生成40种颜色,色相从0到360均匀分布 n <- 40 hues <- seq(0, 360, length.out = n + 1)[1:n] # 调整饱和度(s)和明度(v),数值越低颜色越柔和 my_colors <- hsv(hues / 360, s = 0.7, v = 0.8) # 预览颜色 scales::show_col(my_colors)
如果需要兼顾色觉障碍,可以把色相范围调整到避开红绿色盲难区分的区间,或者用colorspace包把生成的颜色转换成色觉友好的版本:
my_colors <- desaturate(my_colors, amount = 0.1) # 轻微降饱和,提升色觉友好度
方法4:组合viridis系列调色板(兼顾色觉友好)
虽然单个viridis调色板数量有限,但把不同的viridis系列调色板组合起来,既能保证色觉友好,又能凑够足够的数量。
library(viridisLite) library(scales) # 取不同的viridis系列调色板,每个取12种 pal_viridis <- viridis(12) pal_plasma <- plasma(12) pal_inferno <- inferno(12) pal_magma <- magma(12) # 组合后取前40种 combined_viridis <- c(pal_viridis, pal_plasma, pal_inferno, pal_magma)[1:40] # 预览效果 show_col(combined_viridis)
这个方法生成的颜色对色觉障碍人群非常友好,而且每个调色板的色彩风格略有差异,组合后区分度也足够。
小提示
不管用哪种方法,生成颜色后一定要用scales::show_col()预览实际效果,要是发现有颜色太接近,直接删掉或者替换掉就行,灵活调整总能找到适合你图表的配色。
内容的提问来源于stack exchange,提问作者Melinda




