如何在ggplot 2中按类别突出显示特定条形图?

时间:2017-10-11 13:59:09

标签: r ggplot2 tidyverse

使用ggplot2,我试图根据他们的类别使用2种不同的颜色为一组特定的颜色着色。在下面的图中,我有一些红色的特定值的列,但由于我的方法,它从着色中排除了他们的“伙伴列”(它们顶部的cols),当我希望它们填充蓝色时。

如果我更改scale_fill_manual()中的值,则它不会执行任何操作,因为'fill'表达式会优先为'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 个答案:

答案 0 :(得分: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)
)