如何将brewer.pal应用到字符串列表并为不同值分配对应颜色
为字符串列表匹配RColorBrewer颜色的解决方法
问题原因
brewer.pal()返回的是无命名的颜色值向量,使用字符串索引时,R会尝试匹配向量的元素名称,找不到对应名称就会返回NA,而非像整数索引那样按位置取数。
示例复现代码:
library(RColorBrewer) list1 <- c(1,2,3,3,4,4,5) list2 <- c("1","2","3","4","4","5") # 整数索引正常返回颜色 brewer.pal(9,'Set1')[list1] # [1] "#E41A1C" "#377EB8" "#4DAF4A" "#4DAF4A" "#984EA3" "#984EA3" "#FF7F00" # 字符串索引返回NA brewer.pal(9,'Set1')[list2] # [1] NA NA NA NA NA NA
解决方法
方法1:转换为因子取整数索引
适合不需要固定字符串与颜色绑定的场景,会自动按字符串的排序分配颜色:
# 先转因子再转整数作为索引 colors <- brewer.pal(9,'Set1')[as.integer(as.factor(list2))] print(colors) # 输出:#E41A1C #377EB8 #4DAF4A #984EA3 #984EA3 #FF7F00
方法2:给颜色向量设置对应名称
适合需要固定某字符串始终对应特定颜色的场景,后续直接用字符串索引即可:
# 生成颜色向量并设置名称与字符串唯一值对应 unique_str <- unique(list2) color_vec <- setNames(brewer.pal(length(unique_str), 'Set1'), unique_str) # 直接用字符串索引取颜色 colors <- color_vec[list2] print(colors) # 输出: 1 2 3 4 4 5 # "#E41A1C" "#377EB8" "#4DAF4A" "#984EA3" "#984EA3" "#FF7F00"
注意:如果字符串唯一值数量超过所选RColorBrewer调色板的最大颜色数,可改用colorRampPalette()扩展调色板,示例:extended_pal <- colorRampPalette(brewer.pal(9, 'Set1'))(length(unique_str))
内容的提问来源于stack exchange,提问作者Yulia Kentieva
相关产品推荐
相关产品推荐

