使用colorFactor为分组分配颜色时出现颜色与值不匹配的问题求助
colorFactor为分组分配颜色时出现颜色与值不匹配的问题求助
我帮你排查了一下代码,发现问题的根源和你收到的警告信息直接相关!先看那个警告:Unknown or uninitialised column: 'MyCol'——这是因为你在定义颜色映射器MyPal的时候,写错了颜色向量的变量名!你前面明明定义的是MyColors,但这里写成了MyCol,R找不到这个未定义的变量,自然颜色映射就彻底乱了,这就是颜色不匹配的核心原因。
除了这个笔误,还有两个小细节可以优化,避免后续出现其他问题:
arrange()函数最好明确指定要排序的列(arrange(Groups)),虽然当前只有一列不会报错,但明确写法更清晰,也符合dplyr的最佳实践- 在dplyr管道里使用列名时,直接写
Groups就可以,不用额外加MyTest$,管道会自动识别当前数据框的列
下面是修正后的完整代码:
#Define distinct colors (first one is NA color) MyColors = c("#808080","red", "green", "yellow", "orange", "violet", "palegreen4","wheat2","mediumpurple1", "turquoise2", "steelblue", "yellowgreen","tan3","tomato", "palevioletred", "maroon1", "springgreen2" , "brown","violetred","coral2") #Create a dataset where the problem arises MyTest=c(NA,NA,"Group94",NA,NA,"Group193", NA, "Group275", NA, NA, NA, "Group381", NA, "Group435", NA, "Group475", "Group507", NA, "Group193", "Group558", "Group572", "Group94", "Group572","Group650","Group475","Group558","Group684",NA, "Group381", NA, "Group715","Group435","Group715",NA,"Group507","Group684","Group275","Group650") MyTest=as.data.frame(MyTest) colnames(MyTest)="Groups" #Define the colors: MyDomainColors=MyTest %>% select(Groups) %>% distinct() %>% arrange(Groups) # 明确指定排序列 MyDomainColors=as.vector(MyDomainColors[,1]) MyPal <- colorFactor(MyColors[1:length(MyDomainColors)], domain = MyDomainColors, ordered = TRUE) # 修正变量名MyCol为MyColors #Add color as a separate column MyTest=MyTest %>% mutate(MyColor=MyPal(Groups)) # 直接引用列名Groups
修正后你再运行代码,颜色映射就会完全符合你的预期了:NA对应#808080,Group94对应red,Group193对应green,以此类推,不会再出现跳色或者颜色不匹配的问题。
另外补充一个小建议:如果你想更清晰地处理NA的颜色,可以不用把NA的颜色放在颜色向量的第一个位置,而是在colorFactor里用na.color参数指定,比如:
# 把NA颜色从MyColors里移除,单独指定 MyColors = c("red", "green", "yellow", "orange", "violet", "palegreen4","wheat2","mediumpurple1", "turquoise2", "steelblue", "yellowgreen","tan3","tomato", "palevioletred", "maroon1", "springgreen2" , "brown","violetred","coral2") MyPal <- colorFactor(MyColors, domain = na.omit(MyDomainColors), ordered = TRUE, na.color = "#808080")
这样分组颜色和NA颜色的职责更清晰,也避免了需要计算颜色向量长度时还要把NA算进去的麻烦,你可以根据自己的习惯选择哪种方式。
备注:内容来源于stack exchange,提问作者Avocado
相关产品推荐
相关产品推荐

