2017-10-11 4 views
0

En utilisant ggplot2, j'essaye de colorer un ensemble spécifique de barres en utilisant 2 couleurs différentes, selon leurs catégories. Dans l'intrigue ci-dessous, j'ai des colonnes sur une certaine valeur remplie en rouge, mais en raison de ma méthode, il exclut leurs «colonnes partenaires» (les cols sur le dessus) de la coloration, quand je voudrais qu'ils soient remplis de bleu .Comment mettre en surbrillance des barres spécifiques par catégorie dans ggplot 2?

Si je change les valeurs en scale_fill_manual() alors cela ne fait rien car l'expression 'fill' donnera la priorité à la coloration des catégories 'TRUE' et 'FALSE'.

Comment puis-je modifier mon code de sorte que les barres qui accompagnent les barres rouges remplies soient colorées en bleu?

Mon tracé actuel:

enter image description here

Mon code:

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() 

Répondre

1

est ici une façon d'aller à ce sujet:

# 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

exemple de données de sous-ensembles:

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

Hey, merci pour l'aide! Votre réponse est exactement ce dont j'avais besoin! –