Comment forcer plusieurs tracés r à avoir la même longueur de x-ticks? [dupliquer]

Nov 26 2020

Plusieurs packages de R sont capables d'organiser plusieurs graphiques dans une grille, tels que gridExtraet cowplot. Les tracés de la même ligne / colonne sont par défaut alignés sur leur limite. Ce qui suit est un exemple. Trois histogrammes sont disposés verticalement sur le même tracé. Vous pouvez remarquer que les x-ticks ne sont pas alignés et que le tracé de la grille a donc l'air un peu moche.

library(ggplot2);library(grid);library(cowplot)

p1 <- ggplot(data = NULL, aes(x = rt(10,19))) + 
  geom_histogram(bins = 5, fill = "darkgreen", color = "darkgrey", alpha = 0.6) +
  labs(y = "", x = "")
# similar plots for p2, p3

plot_grid(p1, textGrob("N=10"),
             p2, textGrob("N=100"),
             p3, textGrob("N=10000"),
             nrow=3, rel_widths = c(4/5, 1/5))

Le problème est que les outils de traçage dans baseet ggplot2ne fixeraient pas la longueur des x-ticks et étiraient cowplot::plot_gridsimplement automatiquement les tracés à la largeur maximale. Certaines parcelles ont des étiquettes y plus larges, de sorte qu'elles se retrouvent avec des x-ticks plus courts.

Maintenant, je veux forcer les trois histogrammes à avoir les mêmes longueurs de x-ticks. Je voudrais savoir existe-t-il une méthode / un package pour ce genre de problèmes? Notez qu'en général, le remodelage des données combiné à des fonctions comme ggplot2::facet_wrapdevrait résoudre ce problème, mais je me demande toujours s'il existe une solution plus directe.

Réponses

2 teunbrand Nov 26 2020 at 14:33

Personnellement, je pense que le patchwork gère les alignements des parcelles avec élégance et vous pouvez faire en sorte que les parcelles partagent un axe x en fixant les limites sur une échelle commune.

library(ggplot2)
library(patchwork)

set.seed(123)

plots <- lapply(c(10, 100, 1000), function(n) {
  ggplot(mapping = aes(x = rt(n, 19))) +
    geom_histogram(bins = round(sqrt(n)) * 2,
                   fill = "darkgreen", colour = "darkgrey",
                   alpha = 0.6) +
    labs(y = "", x = "")
})

plots[[1]] / plots[[2]] / plots[[3]] &
  scale_x_continuous(limits = c(-5, 5),
                     oob = scales::oob_squish)

Créé le 2020-11-26 par le package reprex (v0.3.0)

1 ClausWilke Nov 27 2020 at 06:53

La plot_grid()fonction peut aligner les tracés, voir ici:https://wilkelab.org/cowplot/articles/aligning_plots.html

library(ggplot2)
library(grid)
library(cowplot)

set.seed(123)

plots <- lapply(c(10, 100, 1000), function(n) {
  ggplot(mapping = aes(x = rt(n, 19))) +
    geom_histogram(bins = round(sqrt(n)) * 2,
                   fill = "darkgreen", colour = "darkgrey",
                   alpha = 0.6) +
    labs(y = "", x = "") +
    scale_x_continuous(
      limits = c(-5, 5),
      oob = scales::oob_squish
    )
})

plot_grid(
  plots[[1]], textGrob("N=10"),
  plots[[2]], textGrob("N=100"),
  plots[[3]], textGrob("N=10000"),
  nrow=3, rel_widths = c(4/5, 1/5), align = "v", axis = "l"
)

Créé le 2020-11-26 par le package reprex (v0.3.0)