4 votes

Combiner des graphiques qui ont une légende avec ceux qui n'en ont pas.

Je peux combiner trois graphiques qui n'ont pas de légendes, mais quand j'ajoute des légendes à deux des graphiques, je ne peux pas les combiner. Comment puis-je combiner des graphiques avec légendes avec un graphique sans légende?

Voici un exemple de comment je combine des graphiques sans légendes:

library(ggplot2)
map_data <- data.frame(lon = c(-177.5, -172.5, -167.5, -162.5, -157.5, -152.5),
                       lat = c(87.5, 87.5, 87.5, 87.5, 87.5, 87.5),
                       ssta = c(-2.78999996, 0.09999999,  0.19999999,  0.06000000,  1.65999997, -0.41000000))

# un map
p.1 <- ggplot() + 
    borders("world", 
          colour="black", 
          fill="white") +
  geom_tile(data = map_data,
            aes(lon,
                lat)) + # pas de valeur de remplissage donc pas de légende
  coord_fixed() + 
  scale_fill_viridis(na.value = "transparent") +
  theme_minimal() 

# un deuxième map, de la même forme générale
p.2 <- p.1

# un graphique en ligne
library(lubridate)
time_sequence <-  seq(dmy("01-01-1800"), 
                      dmy("01-01-1960"), 
                      by = 'month')
long_plot_data <- data.frame(variable = seq(dmy("01-01-1800"), 
                                            dmy("01-01-1960"), 
                                            by = 'month'),
                             value = runif(length(time_sequence)),
                             col = runif(length(time_sequence)))

p.3 <-  ggplot(long_plot_data, 
              aes(variable, 
                  value)) +
  geom_line() +
  theme_minimal()

# combiner les graphiques
library(grid)
grid.newpage()
grid.draw(rbind(ggplotGrob(p.1), 
                ggplotGrob(p.2),
                ggplotGrob(p.3),
                size = "last"))

entrer la description de l'image ici

Et maintenant si j'ajoute une valeur de remplissage aux graphiques de map, j'obtiens une légende et une erreur quand j'essaie de les combiner de la même manière:

# un map
p.1 <- ggplot() + 
    borders("world", 
          colour="black", 
          fill="white") +
  geom_tile(data = map_data,
            aes(lon,
                lat,
                fill = ssta)) + # donne une légende
  coord_fixed() + 
  scale_fill_viridis(na.value = "transparent") +
  theme_minimal() 

Voici à quoi cela ressemble:

entrer la description de l'image ici

# un deuxième map, de la même forme générale
p.2 <- p.1

# un graphique en ligne
library(lubridate)
time_sequence <-  seq(dmy("01-01-1800"), 
                      dmy("01-01-1960"), 
                      by = 'month')
long_plot_data <- data.frame(variable = seq(dmy("01-01-1800"), 
                                            dmy("01-01-1960"), 
                                            by = 'month'),
                             value = runif(length(time_sequence)),
                             col = runif(length(time_sequence)))

p.3 <-  ggplot(long_plot_data, 
              aes(variable, 
                  value)) +
  geom_line() +
  theme_minimal()

Maintenant j'essaie de combiner les deux cartes avec des légendes et le graphique en ligne sans légende:

# combiner les graphiques
library(grid)
grid.newpage()
grid.draw(rbind(ggplotGrob(p.1), 
                ggplotGrob(p.2),
                ggplotGrob(p.3),
                size = "last"))

La sortie est Erreur: ncol(x) == ncol(y) n'est pas TRUE

Mais si j'ajoute une légende au graphique en ligne, de sorte que les trois graphiques aient des légendes, je peux les combiner:

p.3 <-  ggplot(long_plot_data, 
              aes(variable, 
                  value, 
                  colour = col)) +
  geom_line() +
  theme_minimal()

# combiner les graphiques
library(grid)
grid.newpage()
grid.draw(rbind(ggplotGrob(p.1), 
                ggplotGrob(p.2),
                ggplotGrob(p.3),
                size = "last"))

entrer la description de l'image ici

Comment puis-je combiner deux graphiques avec des légendes avec un sans légende?

7voto

Mike H. Points 10739

La raison pour laquelle vous obtenez l'erreur est parce que l'un de vos 3 objets gtable a 5 colonnes tandis que l'autre en a 6 (l'objet p.3 a 5 car vous excluez la légende). Vous pouvez vérifier les différents agencements des objets gtable en faisant :

library(gtable)
gtable_show_layout(ggplotGrob(p.1))
gtable_show_layout(ggplotGrob(p.2))
gtable_show_layout(ggplotGrob(p.3))

Je ne posterai pas les images ici car elles détourneraient de la réponse, mais je pense que cela vaut la peine de vérifier par vous-même.

Quoi qu'il en soit, ce que nous pouvons faire pour remédier à ce problème est simplement d'ajouter une colonne supplémentaire à votre gtable p.3 puis d'utiliser l'option size="first" (car nous voulons que la légende soit à la bonne place pour les graphiques où nous avons des légendes).

Cela devrait fonctionner :

library(grid)
library(gtable)

grid.draw(rbind(ggplotGrob(p.1), 
                ggplotGrob(p.2),
                gtable_add_cols(ggplotGrob(p.3),unit(1,"lines")),
                size = "first"))

enter image description here

Une dernière chose est que le titre de l'axe y sur le dernier graphique chevauche légèrement les étiquettes, cela est dû au fait que nous avons pris les dimensions du premier graphique et que les étiquettes sont plus petites sur le premier graphique (donc les étiquettes de l'axe y ont besoin de moins d'espace). Pour remédier à cela, vous pourriez légèrement modifier votre code p.3 comme suit :

p.3<-  ggplot(long_plot_data, 
               aes(variable, 
                   value)) +
  geom_line() +
  theme_minimal() %+replace% theme(axis.title.y=element_text(margin=margin(0,20,0,0),angle=90))

Relancer nous donne :

grid.draw(rbind(ggplotGrob(p.1), 
                ggplotGrob(p.2),
                gtable_add_cols(ggplotGrob(p.3),unit(1,"lines")),
                size = "first"))

enter image description here

2voto

dww Points 13254

En utilisant plot_grid() du package cowplot peut aider - du moins il parvient à combiner des graphiques avec et sans légendes, mais il semble difficile d'aligner parfaitement les graphiques. Je publie quand même, car cela pourrait être utile et peut-être que quelqu'un d'autre sait comment résoudre le problème d'alignement.

Notez, j'ai ajouté coord_fixed() également au graphique linéaire, pour le faire de la même taille que les cartes.

p.3 <- ggplot(long_plot_data, aes(variable, value)) +
  geom_line() +
  coord_fixed() + 
  theme_minimal() 

library(cowplot)
plot_grid(p.1,p.2,p.3,ncol=1, align='h')

enter image description here

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X