Добавить оси в сетку ggplots - PullRequest
0 голосов
/ 19 октября 2018

У меня есть сетка, состоящая из нескольких ggplots, и я хочу добавить ось x, где отметки оси и аннотации добавляются между графиками.Я не мог придумать лучшего решения, чем создать собственный график для оси и добавить его ниже с помощью arrangeGrob.Но они не совпадают с графиками (я рисую стрелки там, где должны быть цифры).Также есть большое пустое пространство, ниже которого я не хочу.

Мне также понадобится аналог для оси Y.

library(ggplot2)
library(gridExtra)
library(ggpubr)
library(grid)

# Create a grid with several ggplots
p <- 
  ggplot(mtcars, aes(wt, mpg)) + 
  geom_point() + 
  theme_transparent() +
  theme(plot.background = element_rect(color = "black"))

main.plot <- arrangeGrob(p, p, p, p, p, p, p, p, ncol = 4, nrow = 2)
# grid.draw(main.plot)

# Now add an x axis to the main plot
x.breaks <- c(0, 1, 2.5, 8, 10)
p.axis <- ggplot() + 
  ylim(-0.1, 0) +
  xlim(1, length(x.breaks)) +
  ggpubr::theme_transparent()

for (i in seq_along(x.breaks)) {
  p.axis <- p.axis +
    geom_text(aes_(x = i, y = -0.01, label = as.character(x.breaks[i])), color = "red")
}
# p.axis

final.plot <- arrangeGrob(main.plot, p.axis, nrow = 2)
grid.draw(final.plot)

enter image description here

Любая помощь приветствуется.

1 Ответ

0 голосов
/ 22 октября 2018

Примечание. В приведенном ниже коде я предполагаю, что каждый график в вашей сетке имеет одинаковую ширину / высоту и использует одинаково расположенные позиции меток.Если это не так, вам придется самостоятельно регулировать позиции.

Добавление оси x к main.plot:

library(gtable)

# create additional row below main plot
# height may vary, depending on your actual plot dimensions
main.plot.x <- gtable_add_rows(main.plot, heights = unit(20, "points"))

# optional: check results to verify position of the new row
dev.off(); gtable_show_layout(main.plot.x)

# create x-axis labels as a text grob
x.axis.grob <- textGrob(label = x.breaks,
                        x = unit(seq(0, 1, length.out = length(x.breaks)), "npc"),
                        y = unit(0.75, "npc"),
                        just = "top")

# insert text grob
main.plot.x <- gtable_add_grob(main.plot.x,
                               x.axis.grob,
                               t = nrow(main.plot.x), 
                               l = 1, 
                               r = ncol(main.plot.x),
                               clip = "off")

# check results
dev.off(); grid.draw(main.plot.x)

with x-axis labels added

Вы можете сделать то же самое для оси Y:

# create additional col
main.plot.xy <- gtable_add_cols(main.plot.x, widths = unit(20, "points"), pos = 0)

# create y-axis labels as a text grob
y.breaks <- c("a", "b", "c") # placeholder, since this wasn't specified in the question
y.axis.grob <- textGrob(label = y.breaks,
                        x = unit(0.75, "npc"),
                        y = unit(seq(0, 1, length.out = length(y.breaks)), "npc"),
                        just = "right")

# add text grob into main plot's gtable
main.plot.xy <- gtable_add_grob(main.plot.xy,
                               y.axis.grob,
                               t = 1, 
                               l = 1, 
                               b = nrow(main.plot.xy) - 1,
                               clip = "off")

# check results
dev.off(); grid.draw(main.plot.xy)

with y-axis labels

(Обратите внимание, что приведенный выше порядок оси Xпосле которой ось Y не должна переключаться вслепую. Если вы добавляете строки / столбцы, рекомендуется часто использовать gtable_show_layout(), чтобы проверять последние размеры gtable-объектов и убедиться, что вы вставляете новые пометки в нужные ячейки.)

Наконец, давайте добавим некоторый буфер со всех сторон, чтобы надписи и границы графиков не обрезались:

final.plot <- gtable_add_padding(main.plot.xy,
                                 padding = unit(20, "points"))

dev.off(); grid.draw(final.plot)

with buffer

...