使用grid.arrange精确定位ggplot2中的多个图

时间:2016-07-09 11:37:46

标签: r plot ggplot2 gridextra

我正在尝试使用相同的x轴但不同的y轴创建多个绘图,因为我有两个具有不同范围的组的值。由于我想控制轴的值(分别是y轴应达到2.000.000到4.000.000和250.000到500.000),我与facet_grid的{​​{1}}不相容scales = "free" }。

所以我尝试过创建两个图(名为“plots.treat”和“plot.control”)并将它们与grid.arrangearrangeGrob结合起来。我的问题是,我不知道如何控制两个图的确切位置,因此两个y轴都位于一条垂直线上。所以在下面的例子中,第二个图的y轴需要向右偏移一点。

enter image description here

以下是代码:

# Load Packages
library(ggplot2)
library(grid)
library(gridExtra)

# Create Data
data.treat <- data.frame(seq(2005.5, 2015.5, 1), rep("SIFI", 11), 
                    c(2230773, 2287162, 2326435, 2553602, 2829325, 3372657, 3512437, 
                      3533884, 3519026, 3566553, 3527153))

colnames(data.treat) <- c("Jahr", "treatment", 
                          "Aggregierte Depositen (in Tausend US$)")

data.control <- data.frame(seq(2005.5, 2015.5, 1), rep("Nicht-SIFI", 11), 
                    c(324582, 345245, 364592, 360006, 363677, 384674, 369007,
                      343893, 333370, 318409, 313853))

colnames(data.control) <- c("Jahr", "treatment", 
                            "Aggregierte Depositen (in Tausend US$)")

# Create Plot for data.treat
plot.treat <- ggplot() +
  geom_line(data = data.treat, 
            aes(x = `Jahr`, 
                y = `Aggregierte Depositen (in Tausend US$)`), 
            size = 1,
            linetype = "dashed") +
  geom_point(data = data.treat, 
             aes(x = `Jahr`, 
                 y = `Aggregierte Depositen (in Tausend US$)`), 
             fill = "white",
             size = 2,
             shape = 24) +
  scale_x_continuous(breaks = seq(2005, 2015.5, 1),
                     minor_breaks = seq(2005, 2015.5, 0.5),
                     limits = c(2005, 2015.8),
                     expand = c(0.01, 0.01)) +
  scale_y_continuous(breaks = seq(2000000, 4000000, 500000),
                     minor_breaks = seq(2000000, 4000000, 250000),
                     labels = c("2.000.000", "2.500.000", "3.000.000", 
                                "3.500.000", "4.000.000"),
                     limits = c(2000000, 4000000),
                     expand = c(0, 0.01)) + 
  theme(text = element_text(family = "Times"),  
        axis.title.x = element_blank(), 
        axis.title.y = element_blank(), 
        axis.line.x = element_line(color="black", size = 0.6),
        axis.line.y = element_line(color="black", size = 0.6),
        legend.position = "none") +
  geom_segment(aes(x = c(2008.7068), 
                   y = c(2000000), 
                   xend = c(2008.7068),
                   yend = c(3750000)),
               linetype = "dotted") + 
  annotate(geom = "text", x = 2008.7068, y = 3875000, label = "Lehman\nBrothers + TARP", 
           colour = "black", size = 3, family = "Times") +
  geom_segment(aes(x = c(2010.5507), 
                   y = c(2000000), 
                   xend = c(2010.5507),
                   yend = c(3750000)),
               linetype = "dotted") + 
  annotate(geom = "text", x = 2010.5507, y = 3875000, label = "Dodd-Frank-\nAct", 
           colour = "black", size = 3, family = "Times") +
  geom_rect(aes(xmin = 2007.6027, xmax = 2009.5, ymin = -Inf, ymax = Inf),
            fill="dark grey", alpha = 0.2) 

# Create Plot for data.control
plot.control <- ggplot() +
  geom_line(data = data.control, 
            aes(x = `Jahr`, 
                y = `Aggregierte Depositen (in Tausend US$)`), 
            size = 1,
            linetype = "solid") +
  geom_point(data = data.control, 
             aes(x = `Jahr`, 
                 y = `Aggregierte Depositen (in Tausend US$)`), 
             fill = "white",
             size = 2,
             shape = 21) +
  scale_x_continuous(breaks = seq(2005, 2015.5, 1), # x-Achse
                     minor_breaks = seq(2005, 2015.5, 0.5),
                     limits = c(2005, 2015.8),
                     expand = c(0.01, 0.01)) + 
  scale_y_continuous(breaks = seq(250000, 500000, 50000),
                     minor_breaks = seq(250000, 500000, 25000),
                     labels = c("250.000", "300.000", "350.000", "400.000",
                                "450.000", "500.000"),
                     limits = c(250000, 500000),
                     expand = c(0, 0.01)) + 
  theme(text = element_text(family = "Times"),  
        axis.title.x = element_blank(), # Achse
        axis.title.y = element_blank(), # Achse
        axis.line.x = element_line(color="black", size = 0.6),
        axis.line.y = element_line(color="black", size = 0.6),
        legend.position = "none") +
  geom_segment(aes(x = c(2008.7068), 
                   y = c(250000), 
                   xend = c(2008.7068),
                   yend = c(468750)),
               linetype = "dotted") + 
  annotate(geom = "text", x = 2008.7068, y = 484375, label = "Lehman\nBrothers + TARP", 
           colour = "black", size = 3, family = "Times") +
  geom_segment(aes(x = c(2010.5507), 
                   y = c(250000), 
                   xend = c(2010.5507),
                   yend = c(468750)),
               linetype = "dotted") + 
  annotate(geom = "text", x = 2010.5507, y = 484375, label = "Dodd-Frank-\nAct", 
           colour = "black", size = 3, family = "Times") + 
  geom_rect(aes(xmin = 2007.6027, xmax = 2009.5, ymin = -Inf, ymax = Inf),
            fill="dark grey", alpha = 0.2)

# Combine both Plots with grid.arrange
grid.arrange(arrangeGrob(plot.treat, plot.control, 
                         ncol = 1,
                         left = textGrob("Aggregierte Depositen (in Tausend US$)", 
                                         rot = 90,
                                         vjust = 1,
                                         gp = gpar(fontfamily = "Times",
                                                   size = 12,
                                                   colout = "black",
                                                   fontface = "bold")),
                         bottom = textGrob("Jahr",
                                           vjust = 0.1,
                                           hjust = 0.2,
                                           gp = gpar(fontfamily = "Times",
                                                     size = 12,
                                                     colout = "black",
                                                     fontface = "bold"))))

1 个答案:

答案 0 :(得分:9)

做:

install.packages("cowplot")

library(cowplot),因为它会搞乱你的主题作品。

然后,做:

grid.arrange(
  arrangeGrob(cowplot::plot_grid(plot.treat, plot.control, align = "v", ncol=1),
              ncol = 1,
              left = textGrob("Aggregierte Depositen (in Tausend US$)", 
                              rot = 90,
                              vjust = 1,
                              gp = gpar(fontfamily = "Times",
                                        size = 12,
                                        colout = "black",
                                        fontface = "bold")),
              bottom = textGrob("Jahr",
                                vjust = 0.1,
                                hjust = 0.2,
                                gp = gpar(fontfamily = "Times",
                                          size = 12,
                                          colout = "black",
                                          fontface = "bold"))))

enter image description here