ggplot - одинаковая длина оси x для выровненных графиков с осью 2 и 3 - PullRequest
0 голосов
/ 30 января 2019

Я хочу выровнять график с 3-й осью с графиком с 2-й осью, чтобы длины оси x были идентичны.

Но из-за третьей оси первого графикадлины оси x различны для разных графиков.

library(ggplot2)
library(grid)
library(patchwork)

Мои данные:

data_1 <- data.frame(x = c(1,2,3,4),
               y1 = c(5,8,1,6),
               y2 = c(90,40,70,50),
               y3 = c(600,800,900,1000))

data_2 <- data.frame(x = c(1,2,3,4),
                 y1 = c(9,4,2,1),
                 y2 = c(45,70,20,10))

Мой первый график (выполненный с data_1):

 plot_1a <- ggplot(data = data_1, aes(x = x)) +

  geom_line(aes(y = y1, color = "y1")) + 

  scale_y_continuous(sec.axis = sec_axis(trans = ~ ./ 0.09, name = "y2")) + 

  geom_line(aes(y = y2 * 0.09, color = "y2")) + 

  geom_line(aes(y = y3 * 0.008, color = "y3")) + 

  scale_color_manual(values = c("y1" = "red", "y2" = "green", "y3" = "blue")) +

  guides(colour = FALSE) +

  theme(axis.text.y.left = element_text(color = "red"), 
        axis.ticks.y.left = element_line(color = "red"),
        axis.line.y.left = element_line(color = "red"),
        axis.title.y.left = element_text(color = "red"),

        axis.text.y.right = element_text(color = "green"), 
        axis.ticks.y.right = element_line(color = "green"),
        axis.line.y.right = element_line(color = "green"),
        axis.title.y.right = element_text(color = "green"))


plot_1b <- ggplot(data = data_1, aes(x = x)) +

  scale_y_continuous(sec.axis = sec_axis(trans = ~ . / 0.008, name = "y3")) +

  labs(x = "", y = "") +

  theme(axis.text.y.right = element_text(color = "blue"), 
        axis.ticks.y.right = element_line(color = "blue"),
        axis.line.y.right = element_line(color = "blue"),
        axis.title.y.right = element_text(color = "blue") ,

        axis.text.y.left = element_blank(),
        axis.line.y.left = element_blank(),
        axis.ticks.y.left = element_blank(),

        axis.line.x = element_blank(),
        axis.text.x = element_blank(),
        axis.ticks.x = element_blank(),

        panel.background = element_blank(),
        plot.margin = margin(1, 0, 1, 1, "mm"))

plot_1 <- plot_1a + plot_1b + plot_layout(ncol = 2,  widths = c(1,1e-3))

Мой второй график (с данными_2):

   plot_2 <- ggplot(data = data_2, aes(x = x)) +

  geom_line(aes(y = y1, color = "y1")) + 

  scale_y_continuous(sec.axis = sec_axis(trans = ~ ./ 0.09, name = "y2")) + 

  geom_line(aes(y = y2 * 0.09, color = "y2")) + 

  scale_color_manual(values = c("y1" = "red", "y2" = "green")) +

  guides(colour = FALSE) +

  theme(axis.text.y.left = element_text(color = "red"), 
        axis.ticks.y.left = element_line(color = "red"),
        axis.line.y.left = element_line(color = "red"),
        axis.title.y.left = element_text(color = "red"),

        axis.text.y.right = element_text(color = "green"), 
        axis.ticks.y.right = element_line(color = "green"),
        axis.line.y.right = element_line(color = "green"),
        axis.title.y.right = element_text(color = "green"))

Я хочу выровнять их по вертикали.Поэтому я делаю:

vplayout <- function(x, y) viewport(layout.pos.row = x, layout.pos.col = y)
grid.newpage()

pushViewport(viewport(layout = grid.layout(2, 1)))

print(plot_1, vp = vplayout(1, 1))
print(plot_2, vp = vplayout(2, 1))

Но он возвращает мне оба графика, которые не выровнены так, как я хочу.Я хочу, чтобы красная и зеленая оси Y были выровнены по вертикали (т. Е. Длины оси x идентичны).

1 Ответ

0 голосов
/ 30 января 2019

Возможно, вы захотите отправить запрос на добавление функции сопровождающим patchwork с просьбой выложить вещи в сетку nxn.Я поиграл с этим, так как это было бы самое простое решение, но оно не представляется возможным.

Вот одно решение, использующее grid.arrange из gridExtra и ggplotGrob из ggplot2:

library(gridExtra)
p <- rbind(ggplotGrob(plot_1a), ggplotGrob(plot_2), size="last")
q <- ggplotGrob(plot_1b)
q$heights <- p$heights
grid.arrange(p,q,widths=c(8,1))

Настройте widths в grid.arrange по желанию.

aligned axes with grid.arrange

...