scale_fill_manual中系数颜色与顺序不一致问题求助
问题原因与解决方案
你在scale_fill_manual和scale_color_manual中设置的limits仅控制图例的显示顺序,但ggplot分组元素(如点、误差线)的排列顺序是由数据中category列的因子水平顺序决定的,而非scale参数。你的原始数据里category是字符型,ggplot会默认按字母顺序(Black、Female、Hispanic、Male、White)处理,这就是绘图顺序和图例不一致的原因。
解决步骤
将category转换为指定顺序的因子,让ggplot按照你需要的顺序排列分组元素:
方法1:预处理数据(推荐)
在绘图前修改数据,把category设置为有序因子:
dtest <- dtest %>% mutate(category = factor(category, levels = c("Black", "Hispanic", "White", "Female", "Male")))
方法2:在ggplot的aes中直接指定
如果不想修改原始数据,可以在aes里临时转换因子:
dtest %>% ggplot(aes(x = coef, y = as.factor(model), xmin = ci_lower, xmax = ci_upper, color = factor(category, levels = c("Black", "Hispanic", "White", "Female", "Male")), fill = factor(category, levels = c("Black", "Hispanic", "White", "Female", "Male")))) + facet_wrap(~outcome, nrow = 3, scales = "free") + geom_errorbar(width = 0, size = 1.1, alpha = 0.6, position = position_dodge(width = 0.5)) + geom_errorbar(aes(x = -coef, xmin = -ci_lower, xmax = -ci_upper), width = 0, size = 1.1, alpha = 0, position = position_dodge(width = 0.5)) + geom_point(shape = 22, size = 2.5, color = 'white', position = position_dodge(width = 0.5)) + geom_vline(xintercept = 0, linetype = "dashed", color = "blue", linewidth = .3) + scale_y_discrete(labels = outcome_labels) + scale_fill_manual(values = c("Black" = "indianred2", "Hispanic" = "tan2", "White" = "lightgoldenrod1", "Female" = "gray10", "Male" = "gray70")) + scale_color_manual(values = c("Black" = "indianred2", "Hispanic" = "tan2", "White" = "lightgoldenrod1", "Female" = "gray10", "Male" = "gray70")) + theme_bw(base_size = 14) + theme(legend.title = element_blank())
说明
完成上述修改后,position_dodge会按照你指定的因子水平顺序排列每个model对应的分组元素,绘图中的颜色/系数顺序就会和图例保持一致(从上到下:Black、Hispanic、White、Female、Male)。
内容的提问来源于stack exchange,提问作者a_todd12
相关产品推荐
相关产品推荐

