GGplot2: Couleurs différentes texte axe des ordonnées

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Simon Paul
Messages : 10
Enregistré le : 26 Fév 2019, 11:35

GGplot2: Couleurs différentes texte axe des ordonnées

Messagepar Simon Paul » 04 Juil 2019, 18:19

Bonjour,
J’ai réalisé un graphique des fréquences de détection des molécules d’une station donnée pour chaque période (1, 2,3). Sur l’axe des ordonnées j’ai le nom des molécules. J’aimerai définir une couleur de texte (molécule) en fonction de sa famille d’appartenance (il existe 3 familles).

Structure de ma base:

Code : Tout sélectionner

Molecule          Value           Periode           Station       Famille
Atrazine            10%                1               A             HERB
Glyphosate         30%                1               B             FONG
Fluopyram         50%                1               C             INS
AMPA             23%                1               A             HERB
AMPA             20%                2               B             HERB
AMPA             15%                3               C             HERB
......          .........    ........        ...........    ..........


Script

Code : Tout sélectionner


e<-ggplot(mdata_A_P, aes(reorder(Molecule, value, sum),value , fill = variable)) +
  geom_bar(aes(),stat = "identity", width=0.8)+
  geom_hline(yintercept=20, color="black", linetype = "dashed", size=0.8) +
  coord_flip()+
  theme_bw()+
  scale_y_continuous(breaks=c(0,10,20,30, 40,50, 60,70, 80,90, 100), labels = c("0","10%","20%","30%", "40%","50%", "60%","70%", "80%","90%", "100%"))+
  scale_x_discrete(limits=c("Atrazine",   "Fluopyram",   "Thiafluamide", "AMPA ", "Glyphosate"…… )+
  scale_fill_manual(values=c("#ec7063","#f8c471", "#73c6b6"))+
  facet_grid(Station ~ Periode)+
  labs(fill = element_blank())+
  theme(legend.position = "top", axis.title.x = element_blank(), axis.title.y = element_blank(),axis.text.y = element_text( hjust=1, vjust=1, size=7, color="grey30"),axis.text.x = element_text( angle=55, hjust=1, vjust=1, size=7.5, color="grey30"),plot.margin = unit(c(0,0,0,0), "cm"), strip.background.y  = element_rect(fill="#E2DDD4"), strip.text.y = element_text( size = 9, color = "grey30", face = "bold" ), strip.background.x  = element_rect(fill="#E2DDD4"), strip.text.x = element_text( size = 9, color = "grey30", face = "bold" ))
e


Merci d'avance pour votre aide!

Facundo Muñoz
Messages : 156
Enregistré le : 04 Juil 2019, 09:58
Contact :

Re: GGplot2: Couleurs différentes texte axe des ordonnées

Messagepar Facundo Muñoz » 08 Juil 2019, 10:17

Salut,

Ton exemple n'est pas tout à fait reproductible. Dans ton code pour le plot, tu fais référence à les variables "Molecule", "value" et "variable" qui n'existent pas dans ton tableau. J'imagine que les deux premières correspondent à "Molécules" et "Values". La troisième est-elle "Famille" peut-être ?

Sinon, la couleur du texte des axes est définie dans le `element_text()` du `axis.text.y`. Tu utilises une couleur fixe ('grey30'), mais tu peux passer aussi un vecteur. Il faut juste s'assurer que l'ordre soit correcte. Un exemple ci-dessous :

Code : Tout sélectionner


mdata_A_P$Molecule <- factor(
  mdata_A_P$Molecule,
  levels = c(
    "Atrazine",
    "Fluopyram",
    "Thiafluamide",
    "AMPA",
    "Glyphosate"
  )
)

family_colours <- c("#ec7063", "#f8c471", "#73c6b6")

coldat <-
  merge(
    data.frame(
      Molecule = factor(
        levels(mdata_A_P$Molecule),
        levels = levels(mdata_A_P$Molecule)
      )
    ),
    unique(mdata_A_P[, c("Molecule", "Famille")]),
    all.x = TRUE
  )
coldat$col <- family_colours[factor(coldat$Famille)]


ggplot(mdata_A_P, aes(Molecule, Value , fill = Famille)) +
  geom_bar(aes(), stat = "identity", width = 0.8) +
  geom_hline(
    yintercept = 20,
    color = "black",
    linetype = "dashed",
    size = 0.8
  ) +
  coord_flip() +
  theme_bw() +
  scale_x_discrete(drop = FALSE) +
  scale_y_continuous(
    breaks = seq(0, 100, by = 10),
    labels = paste0(seq(0, 100, by = 10), "%")
  ) +
  scale_fill_manual(values = family_colours) +
  facet_grid(Station ~ Periode) +
  labs(fill = element_blank()) +
  theme(
    legend.position = "top",
    axis.title.x = element_blank(),
    axis.title.y = element_blank(),
    axis.text.y = element_text(
      hjust = 1,
      vjust = 1,
      size = 7,
      color = coldat$col
    ),
    axis.text.x = element_text(
      angle = 55,
      hjust = 1,
      vjust = 1,
      size = 7.5,
      color = "grey30"
    ),
    plot.margin = unit(c(0, 0, 0, 0), "cm"),
    strip.background.y  = element_rect(fill = "#E2DDD4"),
    strip.text.y = element_text(size = 9, color = "grey30", face = "bold"),
    strip.background.x  = element_rect(fill = "#E2DDD4"),
    strip.text.x = element_text(size = 9, color = "grey30", face = "bold")
  )

mdata_A_P$Molecule <- factor(
  mdata_A_P$Molecule,
  levels = c(
    "Atrazine",
    "Fluopyram",
    "Thiafluamide",
    "AMPA",
    "Glyphosate"
  )
)

family_colours <- c("#ec7063", "#f8c471", "#73c6b6")

coldat <-
  merge(
    data.frame(
      Molecule = factor(
        levels(mdata_A_P$Molecule),
        levels = levels(mdata_A_P$Molecule)
      )
    ),
    unique(mdata_A_P[, c("Molecule", "Famille")]),
    all.x = TRUE
  )
coldat$col <- family_colours[factor(coldat$Famille)]


ggplot(mdata_A_P, aes(Molecule, Value , fill = Famille)) +
  geom_bar(aes(), stat = "identity", width = 0.8) +
  geom_hline(
    yintercept = 20,
    color = "black",
    linetype = "dashed",
    size = 0.8
  ) +
  coord_flip() +
  theme_bw() +
  scale_x_discrete(drop = FALSE) +
  scale_y_continuous(
    breaks = seq(0, 100, by = 10),
    labels = paste0(seq(0, 100, by = 10), "%")
  ) +
  scale_fill_manual(values = family_colours) +
  facet_grid(Station ~ Periode) +
  labs(fill = element_blank()) +
  theme(
    legend.position = "top",
    axis.title.x = element_blank(),
    axis.title.y = element_blank(),
    axis.text.y = element_text(
      hjust = 1,
      vjust = 1,
      size = 7,
      color = coldat$col
    ),
    axis.text.x = element_text(
      angle = 55,
      hjust = 1,
      vjust = 1,
      size = 7.5,
      color = "grey30"
    ),
    plot.margin = unit(c(0, 0, 0, 0), "cm"),
    strip.background.y  = element_rect(fill = "#E2DDD4"),
    strip.text.y = element_text(size = 9, color = "grey30", face = "bold"),
    strip.background.x  = element_rect(fill = "#E2DDD4"),
    strip.text.x = element_text(size = 9, color = "grey30", face = "bold")
  )


ƒacu.-
ƒacu.-

Simon Paul
Messages : 10
Enregistré le : 26 Fév 2019, 11:35

Re: GGplot2: Couleurs différentes texte axe des ordonnées

Messagepar Simon Paul » 09 Juil 2019, 16:39

Merci pour votre réponse,

Oui en effet molécules =molecule ... mais cela n'a pas vraiment d'importance dans ce cas je pense ...

Alors voilà, justement j'aimerai ne pas a avoir à spécifier pour chaque nom une couleur mais définir la couleur du texte (molécule) en fonction de sa famille d'appartenance (HERB, INS, FONG..). C'est assez laborieux de le faire à la main surtout que ce n'est pas mon seul graph.

Merci d'avance pour votre aide!


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Google [Bot] et 1 invité