ggplot使用scale的breaks参数删除部分图例条目后颜色控制异常如何解决
问题根因
你遇到的颜色异常是因为未指定命名颜色向量时,ggplot2会默认按当前limits返回的分类顺序匹配颜色,当你仅设置breaks = c("4")时,limits默认会和breaks保持一致,剩下的6、8两个分类会被识别为未匹配的离散值,自动调用默认调色板赋值,所以出现颜色偏差。
可行解决方案
方案1:使用命名向量指定颜色映射(最稳妥)
直接给scale_fill_manual的values参数传入绑定了分类名的命名向量,不管图例是否显示某个分类,颜色映射都会完全匹配,不会乱序:
ggplot(mtcars) + geom_col(aes(x = 1:nrow(mtcars), y = disp, fill = paste(cyl))) + scale_fill_manual( values = c("4" = "grey50", "6" = "grey60", "8" = "grey70"), breaks = c("4") )
这个方案不需要额外调整其他参数,后续如果要修改显示的图例条目,只要调整breaks即可,颜色映射不会受影响。
方案2:同时指定limits参数明确全部分类
如果你不想用命名向量,也可以显式设置limits参数列出所有需要映射的分类,再用breaks控制要显示在图例中的条目:
ggplot(mtcars) + geom_col(aes(x = 1:nrow(mtcars), y = disp, fill = paste(cyl))) + scale_fill_manual( values = c("grey50", "grey60", "grey70"), limits = c("4", "6", "8"), breaks = c("4") )
这个方案的效果和方案1完全一致,limits指定的分类顺序会和values的颜色顺序一一对应。
内容的提问来源于stack exchange,提问作者mzuba
相关产品推荐
相关产品推荐

