2017-10-11 42 views
0

使用ggplot2,我试图根据其类别使用2种不同的颜色对一组特定的颜色进行着色。在下面的图中,我列出了一些填充为红色的特定值,但由于我的方法,它会将“合作伙伴列”(列上的列)从着色中排除,但我希望它们充满蓝色。如何在ggplot 2中按类别高亮显示特定的条?

如果我更改scale_fill_manual()中的值,那么它将不会执行任何操作,因为“填充”表达式会优先着色“TRUE”和“FALSE”类别。

我该如何更改我的代码,以便伴随着填充的红色条的条会被涂成蓝色?

我现在的情节:

enter image description here

我的代码:

pop %>% 
    group_by(age_range, sex) %>% 
    summarize(population = sum(population)) %>% 
    mutate(prop = population/sum(population)) %>% 
    ggplot() + 
    geom_col(aes(x = age_range, y = prop, color = sex, 
       fill = (prop >= .504 & sex == 'female' & age_range != '75 - 79'), 
       width = .85), 
      position = 'dodge') + 
    scale_fill_manual(values = c('Grey60', 'Grey60', 'Blue', 'Red')) + 
    scale_color_manual(values = c('Red', 'Blue')) + 
    geom_text(aes(x = age_range, y = prop, fill = sex, label = percent(prop)), 
      position = position_dodge(width = .9), 
      vjust = .358, hjust = 1.1,size = 4, color = 'White') + 
    scale_y_continuous(limits = c(0, 1), expand = c(0,0)) + 
    geom_hline(yintercept = .504, color = 'Grey', alpha = .7) + 
    coord_flip() 

回答

1

这里是去了解的一种方式:

# define TRUE/FALSE condition, then assign the same condition 
# to the male group within the same age range 
pop <- pop %>% 
    mutate(condition = prop >= 0.504 & sex == "female" & age_range != '75 - 79') %>% 
    group_by(age_range) %>% 
    mutate(condition = any(condition)) 

# define colour/fill scale for gender 
sex.scale <- c("female" = "red", "male" = "blue") 

ggplot(pop, 
     aes(x = age_range, y = prop, 
      color = sex, group = sex, 
      label = scales::percent(prop))) + 

    # bars with colored outlines & grey fill 
    geom_col(position = "dodge", fill = "grey60") + 

    # bars with coloured fill; only visible if condition is TRUE 
    geom_col(aes(fill = sex, alpha = condition), 
      position = "dodge") + 

    scale_color_manual(values = sex.scale) + 
    scale_fill_manual(values = sex.scale, guide = F) + 
    scale_alpha_manual(values = c("TRUE" = 1, "FALSE" = 0)) + 
    geom_text(position = position_dodge(width = .9), 
      vjust = .358, hjust = 1.1, 
      size = 4, 
      color = 'White') + 
    scale_y_continuous(limits = c(0, 1), expand = c(0,0)) + 
    geom_hline(yintercept = .504, color = 'Grey', alpha = .7) + 
    coord_flip() 

plot

样本子集数据:

pop <- data.frame(
    age_range = rep(c("10-14", "15-19", "20-24", "25-29"), each = 2), 
    sex = rep(c("male", "female"), by = 4), 
    prop = c(0.51, 0.49, 0.518, 0.482, 0.495, 0.505, 0.446, 0.554) 
) 
+0

嘿,感谢您的帮助!你的回答正是我需要的! –

相关问题