Jak zmusić wiele wykresów r, aby miały taką samą długość znaczników x? [duplikować]

Nov 26 2020

Kilka pakietów w języku R umożliwia układanie wielu wykresów w siatkę, takich jak gridExtrai cowplot. Działki w tym samym wierszu / kolumnie są domyślnie wyrównane do granic. Oto przykład. Trzy histogramy są ułożone pionowo na tym samym wykresie. Możesz zauważyć, że znaczniki x nie są wyrównane, a zatem wykres siatki wygląda trochę brzydko.

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))

Problem polega na tym, że narzędzia kreślące basei ggplot2nie ustalają długości znaczników x, a cowplot::plot_gridpo prostu automatycznie rozciągają wykresy do maksymalnej szerokości. Niektóre wykresy mają szersze etykiety y, więc kończą się krótszymi znacznikami x.

Teraz chcę wymusić na trzech histogramach takie same długości znaczników x. Chciałbym wiedzieć, czy jest jakaś metoda / pakiet dla tego rodzaju problemów? Zauważ, że zwykle przekształcanie danych w połączeniu z funkcjami takimi jak ggplot2::facet_wrappowinno rozwiązać ten problem, ale nadal zastanawiam się, czy istnieje bardziej bezpośrednie rozwiązanie.

Odpowiedzi

2 teunbrand Nov 26 2020 at 14:33

Osobiście uważam, że patchwork z wdziękiem radzi sobie z wyrównaniem działek i możesz mieć działki na wspólnej osi X, ustawiając granice na wspólnej skali.

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)

Utworzono 26.11.2020 przez pakiet reprex (v0.3.0)

1 ClausWilke Nov 27 2020 at 06:53

plot_grid()Funkcja może wyrównać działek, zobacz tutaj: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"
)

Utworzono 26.11.2020 przez pakiet reprex (v0.3.0)