Symboles graph différents symboles légende - ggplot2

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

Harmonie Brissaud
Messages : 2
Enregistré le : 02 Avr 2019, 07:42

Symboles graph différents symboles légende - ggplot2

Messagepar Harmonie Brissaud » 08 Avr 2019, 09:55

Bonjour,

J'ai construit un graphique à partir du code ci-dessous, j'obtiens exactement ce que je veux à un détail près : la symbologie de la légende ne respecte pas la symbologie du graphique. C'est à dire que j'ai des courbes en trait plein et des courbes en pointillés qui s'affichent sur mon graphique, mais dans la légende toutes les courbes sont représentées en trait plein...

Code : Tout sélectionner

plot2017=ggplot(suivi_humidite_2017, aes(x=Date, y=XX01_a))+
  geom_smooth(method = "auto", se=F, aes(x=Date, y=XX01_a,color="XX01_a"), size=0.5)+
   ### Si je mets linetype dans les aes les courbes ne s'affichent pas en pointillés mais en trait plein ###
  geom_smooth(method = "auto", se=F, aes(x=Date, y=XX01_d,color="XX01_d"), size=0.5, linetype="dashed")+
  geom_smooth(method = "auto", se=F, aes(x=Date, y=XX02_a,color="XX02_a"), size=0.5)+
  geom_smooth(method = "auto", se=F, aes(x=Date, y=XX02_d,color="XX02_d"), size=0.5, linetype="dashed")+
  geom_smooth(method = "auto", se=F, aes(x=Date, y=XX03_a,color="XX03_a"), size=0.5)+
  geom_smooth(method = "auto", se=F, aes(x=Date, y=XX03_d,color="XX03_d"), size=0.5, linetype="dashed")+
  scale_y_continuous("% humidite")+
  ggtitle("idsite_2017")+
  theme(plot.title = element_text(size=10),
        legend.title=element_blank(),
        legend.key=element_rect(fill=NA),
        legend.text = element_text(size=10),
        axis.title.x = element_blank(),
        axis.text.x=element_text(size=10, vjust=0.5,colour="black"),
        axis.text.y=element_text(size=10, vjust=0.5,colour="black"),
        axis.title.y = element_text(colour="black", size=11,vjust=2),
        panel.background = element_rect(fill = 'white'),
        panel.grid.major = element_line(colour = "gray80", size=0.25),
        panel.grid.minor = element_line(colour = "gray80", size=0.25),
        axis.ticks.y = element_blank(),
        axis.ticks.x = element_blank(),
        axis.line = element_line(colour = "black", size = 0.25, linetype = "solid"))+
  scale_x_date(date_breaks = "1 month", date_labels = "%b")+
  guides(colour = guide_legend(override.aes = list(size=0.5, fill=NA)))+
  scale_colour_manual(name='', values=c('XX01_a'='dodgerblue',
                                        'XX01_d'='dodgerblue',
                                        'XX02_a'='firebrick1',
                                        'XX02_d'='firebrick1',
                                        'XX03_a'='forestgreen',
                                        'XX03_d'='forestgreen'))


Mes tentatives pour résoudre le problème :

J'ai essayé d'utiliser la fonction scale mais ça ne marche pas, sur les graphiques les courbes s'affichent toujours comme souhaité mais la légende n'a pas changé :

Code : Tout sélectionner

# Essai 1
plot2017 + scale_linetype_manual(name='', values=c('XX01_d'='dashed','XX02_d'='dashed','XX03_d'='dashed'))
# Essai 2
plot2017 + scale_linetype_manual(values=c("solid","dashed","solid","dashed","solid","dashed"))


J'ai essayé en utilisant la fonction guide_legend qui pourtant est censé controler la légende mais sans succès :

Code : Tout sélectionner

plot2017 + guides(linetype = guide_legend(override.aes = list(values=c('XX01_d'='dashed','XX02_d'='dashed','XX03_d'='dashed'))))


J'ai cherché d'autres idées sur internet mais en vain, j'espère vraiment que vous pourrez m'aider.

Merci d'avance pour le temps que vous consacrerez à me répondre.

Harmonie

Pierre-Yves Berrard
Messages : 1029
Enregistré le : 12 Jan 2016, 23:30

Re: Symboles graph différents symboles légende - ggplot2

Messagepar Pierre-Yves Berrard » 11 Avr 2019, 09:12

Bonjour,

Essayer de donner un nom différent à chaque scale_... ?

Votre exemple n'est pas reproductible, donc difficile de faire autre chose qu'une réponse générale.
PY

Mickael Canouil
Messages : 1315
Enregistré le : 04 Avr 2011, 08:53
Contact :

Re: Symboles graph différents symboles légende - ggplot2

Messagepar Mickael Canouil » 12 Avr 2019, 08:23

Bonjour,

le problème vient de votre compréhension de comment fonctionne ggplot2.
Je vous suggère de vous documenter plus sur cette outils et les principes de visualisation qu'il utilise, notamment les "aesthetics".

Pour faire très court, votre format de donnée n'est pas celui adapté pour ggplot2. Même s'il est possible de le faire comme vous avez essayer de le faire, cette méthode est des plus pénible et longue, je ne vous la donnerai donc pas.

Voici un exemple reproductible de ce qu'il faut faire et de l'allure du jeu de donnée:

Code : Tout sélectionner

library(tidyverse)
library(lubridate)

n_points <- 30
dta <- tibble(
  Date = seq(today()-n_points, today()-1, 1),
  XX01_a = rnorm(n = n_points, mean = runif(1)),
  XX01_d = rnorm(n = n_points, mean = runif(1)),
  XX02_a = rnorm(n = n_points, mean = runif(1)),
  XX02_d = rnorm(n = n_points, mean = runif(1)),
  XX03_a = rnorm(n = n_points, mean = runif(1)),
  XX03_d = rnorm(n = n_points, mean = runif(1))
)


Ceci n'est pas un bon format, le bon format, c'est une colonne = un type de variable dans ggplot2

Code : Tout sélectionner

dta
#> # A tibble: 30 x 7
#>    Date        XX01_a  XX01_d  XX02_a  XX02_d XX03_a XX03_d
#>    <date>       <dbl>   <dbl>   <dbl>   <dbl>  <dbl>  <dbl>
#>  1 2019-03-13  1.63   -0.0693 -0.183  -0.454   1.71  -1.85
#>  2 2019-03-14  0.470   1.20   -0.965   0.889  -0.283  1.93
#>  3 2019-03-15  0.517   0.576   2.10    0.526   0.802  0.543
#>  4 2019-03-16  2.31    1.51    0.0840  0.0402  0.163  1.11
#>  5 2019-03-17  0.153   0.0411  1.23    1.30    0.229  0.563
#>  6 2019-03-18  0.691   0.602   0.679   2.30    0.330  2.81
#>  7 2019-03-19 -0.0695  1.24    2.10   -0.419   0.672 -0.966
#>  8 2019-03-20 -0.195  -0.164  -0.0382  3.09   -0.423  1.01
#>  9 2019-03-21  1.17    1.86   -0.317   0.449   1.44   0.545
#> 10 2019-03-22  1.06   -0.281  -0.722   1.41    3.09   0.390
#> # … with 20 more rows


Ici, toutes les variables "XX*" sont vos "y", donc l'idée est de littéralement transformer le jeu de donnée pour que ce soit évident pour n'importe qui et surtout pour ggplot2:

Code : Tout sélectionner

dta_tidy <- dta %>%
  gather(key = "colour_linetype", value = "Y", starts_with("XX0")) %>%
  separate(col = "colour_linetype", into = c("colour", "linetype"), sep = "_")

dta_tidy
#> # A tibble: 180 x 4
#>    Date       colour linetype       Y
#>    <date>     <chr>  <chr>      <dbl>
#>  1 2019-03-13 XX01   a         1.63 
#>  2 2019-03-14 XX01   a         0.470
#>  3 2019-03-15 XX01   a         0.517
#>  4 2019-03-16 XX01   a         2.31 
#>  5 2019-03-17 XX01   a         0.153
#>  6 2019-03-18 XX01   a         0.691
#>  7 2019-03-19 XX01   a        -0.0695
#>  8 2019-03-20 XX01   a        -0.195
#>  9 2019-03-21 XX01   a         1.17 
#> 10 2019-03-22 XX01   a         1.06 
#> # … with 170 more rows

En bonus, on peut même définir des variables pour d'autres "aesthetics" comme colour/color, linetype, shape, etc.

Et d'un coup le graphique consiste à faire un seul et unique "geom_smooth()", et nul besoin de s'embêter à définir les couleurs ou les types de lignes de façons manuels (c'est toujours possible).
Vous pouvez aussi directement changer la palette de couleur, par exemple "scale_colour_viridis_d()" au lieu de "scale_colour_discrete()"

Code : Tout sélectionner

ggplot(data = dta_tidy, mapping = aes(x = Date, y = Y, colour = colour, linetype = linetype)) +
  geom_smooth(se = FALSE, size = 0.5) +
  guides(colour = guide_legend(override.aes = list(size = 0.5, fill = NA))) +
  labs(title = "idsite_2017", y = "% humidite", colour = NULL) +
  theme(
    plot.title = element_text(size = 10),
    legend.title = element_blank(),
    legend.key = element_rect(fill = NA),
    legend.text = element_text(size = 10),
    axis.title.x = element_blank(),
    axis.text.x = element_text(size = 10, vjust = 0.5, colour = "black"),
    axis.text.y = element_text(size = 10, vjust = 0.5, colour = "black"),
    axis.title.y = element_text(colour = "black", size = 11, vjust = 2),
    panel.background = element_rect(fill = "white"),
    panel.grid.major = element_line(colour = "gray80", size = 0.25),
    panel.grid.minor = element_line(colour = "gray80", size = 0.25),
    axis.ticks.y = element_blank(),
    axis.ticks.x = element_blank(),
    axis.line = element_line(colour = "black", size = 0.25, linetype = "solid")
  )
#> `geom_smooth()` using method = 'loess' and formula 'y ~ x'


Image

Cordialement,
Mickaël
mickael.canouil.fr | rlille.fr

Harmonie Brissaud
Messages : 2
Enregistré le : 02 Avr 2019, 07:42

Re: Symboles graph différents symboles légende - ggplot2

Messagepar Harmonie Brissaud » 15 Avr 2019, 10:27

Je vous remercie énormément pour votre réponse très complète, et très juste.

J'ai pu modifier mon script en suivant vos indications et j'obtiens ce que je voulais. J'ai quand même ajouté une ligne de code permettant de définir les couleurs manuellement car il me faut des couleurs bien spécifiques pour chacune des courbes.

Encore merci !

Harmonie


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité