ggplot使用ggthemes主题后折线图例因子顺序异常的原因及解决方法
问题原因拆解
嘿,这个问题我之前也踩过坑!核心原因是ggthemes里的solarized系列主题配套的颜色比例尺(比如你用的scale_colour_solarized)会默认覆盖ggplot2原本的图例排序逻辑。
你之前自定义了有序因子,没加主题时,ggplot2会乖乖遵循你设定的因子层级来排列图例;但一旦调用了scale_colour_solarized,这个函数会按照它内置的颜色映射顺序重新排序图例项,完全不管你之前定义的有序因子顺序,所以折线图例的顺序就乱了。
两种快速修复方案
针对这个问题,有两个简单靠谱的修复方式,选哪个都行:
方案一:给颜色比例尺手动指定breaks
直接在scale_colour_solarized里传入你自定义的有序因子水平,强制它按照你要的顺序来生成图例。修改后的代码大概是这样:
# 先把你自定义的有序因子水平存下来,方便复用 my_order <- levels(testCount$BandType) testCount %>% ggplot(aes(x = tests)) + theme_solarized_2(light = F) + # 关键就是加个breaks参数,指定成你的自定义顺序 scale_colour_solarized('blue', breaks = my_order) + geom_bar(aes(y = ..prop.., fill = BandType), position = position_dodge()) + geom_line(aes(y = value, colour = BandType, group = BandType), size = 1)
方案二:用guides()强制锁死图例顺序
如果你不想改颜色比例尺的参数,也可以用guides()函数单独给颜色图例设定顺序,直接覆盖主题带来的变化:
testCount %>% ggplot(aes(x = tests)) + theme_solarized_2(light = F) + scale_colour_solarized('blue') + geom_bar(aes(y = ..prop.., fill = BandType), position = position_dodge()) + geom_line(aes(y = value, colour = BandType, group = BandType), size = 1) + # 这里指定颜色图例的breaks为你的自定义因子水平 guides(colour = guide_legend(breaks = levels(testCount$BandType)))
额外提醒
如果你柱状图的fill图例也出现了顺序混乱的问题,同理可以给scale_fill_solarized(如果用了的话)加上breaks参数,或者在guides()里同时指定fill的breaks,保证两个图例的顺序统一。
内容的提问来源于stack exchange,提问作者bscout11
相关产品推荐
相关产品推荐

