web-dev-qa-db-fra.com

Définition manuelle des couleurs de groupe pour ggplot2

J'ai un ensemble de données à partir duquel je dois faire plusieurs dizaines de tracés. Les données se composent de 30 groupes et de plusieurs mesures au sein de chaque groupe.

La plupart des parcelles n'utilisent pas tous les groupes à la fois.

Mon objectif est d'avoir une seule palette de couleurs pour l'ensemble des groupes de sorte que tout groupe donné soit de la même couleur dans tous les graphiques. Dans l'exemple ci-dessous, cela signifierait que Group C est de la même couleur dans Plot 1 et en Plot 2.

Ma question est de savoir comment procéder.

J'ai essayé plusieurs variantes de scale_fill_manual (et scal_color_manual, le cas échéant). Bien que les couleurs soient choisies dans la palette désignée, je n'arrive pas à indexer la palette par le groupe, ou d'une autre manière de "sauter" les couleurs correspondant à un groupe manquant

J'ai également pensé à essayer d'ajouter les informations de couleur en tant que colonne des données tracées, mais je ne sais pas comment utiliser ensuite cette colonne comme couleur pour le groupe.

Plot Example

# SAMPLE DATA: 
DT1 <- data.table(Name=c("C_sub1", "A_sub1", "A_sub2"), Value=c(2,5,3), Group=c("C", "A", "A"), key="Group")
DT2 <- data.table(Name=c("A_sub1", "B_sub1", "C_sub1", "C_sub2"), Value=c(4,3,6,3), Group=c("A", "B", "C", "C"), key="Group")

# SAMPLE Color Pallette  
ColorsDT <-  data.table(Group=LETTERS[1:5], Color=c("#333BFF", "#CC6600", "#9633FF", "#E2FF33", "#E3DB71"), key="Group")

# Add a column for Color, according to the Group
DT1[ColorsDT, Color := i.Color]
DT2[ColorsDT, Color := i.Color]

# A Basic Plot
simplePlot <- function(DT, tit) 
  ggplot(DT ,aes(x=Name, y=Value, fill=Group)) +
   geom_bar(stat="identity") + xlab("") + ggtitle(tit)
    # Tried sevearl variations of: 
    #  + scale_fill_manual(values=ColorsDT$Color)


# Plot Them
grid.arrange(ncol=2,  simplePlot(DT1, tit="Plot 1"),  simplePlot(DT2, tit="Plot 2"))
44
Ricardo Saporta

Vous pouvez associer chacun de vos groupes à une couleur, puis passer à la fonction:

group.colors <- c(A = "#333BFF", B = "#CC6600", C ="#9633FF", D = "#E2FF33", E = "#E3DB71")

simplePlot <- function(DT, tit) 
  ggplot(DT ,aes(x=Name, y=Value, fill=Group)) +
  geom_bar(stat="identity") + xlab("") + ggtitle(tit) +
  #Specify colours
  scale_fill_manual(values=group.colors)

Puis en utilisant vos parcelles:

grid.arrange(ncol=2,  simplePlot(DT1, tit="Plot 1"), 
  simplePlot(DT2, tit="Plot 2"))

enter image description here

Je pense que le problème avec votre approche était que les couleurs n'étaient pas nommées, donc scale_fill_manual() ne peut pas les associer. Comparer:

ColorsDT <-  data.table(Group=LETTERS[1:5], Color=c("#333BFF", "#CC6600", "#9633FF", "#E2FF33", "#E3DB71"), key="Group")
ColorsDT
#   Group   Color
#1:     A #333BFF
#2:     B #CC6600
#3:     C #9633FF
#4:     D #E2FF33
#5:     E #E3DB71

avec:

ColorsDT.name <-  data.table(A = "#333BFF", B = "#CC6600", C = "#9633FF", D = "#E2FF33", E =  "#E3DB71")
ColorsDT.name
#          A       B       C       D       E
# 1: #333BFF #CC6600 #9633FF #E2FF33 #E3DB71
51
alexwhan