Je fais une présentation et je voudrais mettre en évidence le taux d'occurrence de l'un de mes niveaux de facteur sur une diapositive en conservant la couleur de ce niveau de facteur particulier, tout en grisant les autres niveaux de facteur à travers d'autres variables.

enter image description here

En utilisant l'ensemble de données Arthritis dans la bibliothèque vcd comme exemple:

library(vcd)
ggplot(Arthritis, aes(x = Sex, fill = Improved)) + geom_bar(position = "fill")

Quand, par exemple, je parle au public de l'amélioration marquée chez les mâles, puis-je avoir une version de l'intrigue qui conserve la couleur d'une amélioration marquée chez les mâles, mais grise tout le reste? De préférence en utilisant différentes nuances de gris pour garder les limites?

1
dmt 17 nov. 2017 à 19:18

3 réponses

Meilleure réponse

Considérez cet exemple:

library(scales)
library(ggplot2)

ggplot(Arthritis)+
  geom_bar(aes(x = Sex, group = Improved), fill = c("red", "blue", "green", "yellow", "grey50", "black"), position = "fill")

enter image description here

Pour modifier le champ spécifié, tandis que les autres conservent les couleurs par défaut de ggplot:

ggplot(Arthritis)+
  geom_bar(aes(x = Sex,
               group = Improved),
           fill = c(rev(hue_pal()(3)),
                    "black",
                    hue_pal()(3)[2:1]),
            position = "fill")

enter image description here

Ou griser le reste avec des nuances

ggplot(Arthritis)+
  geom_bar(aes(x = Sex,
               group = Improved),
           fill = c(paste0("grey", 7:9*10),
                    hue_pal()(3)[3],
                    paste0("grey", 8:9*10)),
           position = "fill")

enter image description here

Pour conserver la légende, tracez simplement ce qui précède sur votre couche initiale:

ggplot(Arthritis)+
  geom_bar(aes(x = Sex, fill = Improved),  position = "fill")+
  geom_bar(aes(x = Sex,
               group = Improved),
           fill = c(paste0("grey", 7:9*10),
                    hue_pal()(3)[3],
                    paste0("grey", 8:9*10)),
           position = "fill")

enter image description here

2
missuse 29 nov. 2017 à 11:44

Vous pouvez ajouter une colonne contenant la carte des couleurs et l'utiliser avec scales_fill_identity().


reprex::reprex_info()
#> Created by the reprex package v0.1.1.9000 on 2017-11-18

library(vcd)
#> Loading required package: grid

lvls <- levels(Arthritis$Improved)
color_maps <- scales::grey_pal(start = 0.8, end = 0.9)(length(lvls))
names(color_maps) <- lvls


library(dplyr, warn.conflicts = FALSE)

Arthritis_w_fill <- Arthritis %>%
  mutate(
    fill = if_else(
      Sex == "Male" & Improved == "Marked",
      "blue",
      color_maps[Improved]
  )
)


library(ggplot2)

ggplot(Arthritis_w_fill, aes(x = Sex, fill = fill)) +
  geom_bar(position = "fill") +
  scale_fill_identity(guide = "legend",
                      breaks = c(color_maps, "blue"),
                      labels = c(lvls, 'Sex == "Male" & Improved == "Marked"'))

0
yutannihilation 18 nov. 2017 à 12:24

Ajouter

scale_fill_manual(values=c("Marked" = "RoyalBlue", "Some" = "DarkGrey", "None"="LightGrey"))

Appel ggplot complet:

ggplot(Arthritis, aes(x = Sex, fill = Improved)) + 
  geom_bar(position = "fill")+
  scale_fill_manual(values=c("Marked" = "RoyalBlue", "Some" = "DarkGrey", "None"="LightGrey"))

enter image description here

1
Mako212 17 nov. 2017 à 16:47
47354990