suknat
suknat

Reputation: 335

Curious behaviour using gridExtra (ggplot)

I am trying to stack three plots on top of each other using the gridExtra package. I have tried the the first example that uses grid.arrange from here, which works absolutely fine.

However, when I try to use my own plots, I get axes for each plot but no data, with all the formatting stripped out. Minimum working example:

library(ggplot2)
library(gridExtra)    

popu_H0 <- seq(10, 30, length=100)
popu_H0_norm <- dnorm(popu_H0, mean = 20, sd = 4)

popu_H0_df <- as.data.frame(cbind(popu_H0, popu_H0_norm))
plot_H0 <- ggplot(popu_H0_df, aes(x=popu_H0, y=popu_H0_norm))
plot_H0 + 
  geom_line() +
  theme(
    text = element_text(size=20), 
    axis.title.x = element_text(vjust=0.1),
    axis.text.x = element_text(size = rel(1.8)),
    legend.position = "none",
    axis.title.y = element_blank(),
    axis.text.y = element_blank(),
    axis.ticks.y = element_blank(),
    axis.line.y = element_blank()
  ) +
  xlab("New label") +
  annotate("text", x = 20, y = 0.05, label = "Some annotation", size = 10) 

grid.arrange(plot_H0, plot_H0, plot_H0, ncol = 1, nrow = 3)

ggplot produces the expected output, but grid.arrange produces this.

Upvotes: 0

Views: 48

Answers (1)

Kota Mori
Kota Mori

Reputation: 6740

You forgot to replace the plot object.

library(ggplot2)
library(gridExtra)
popu_H0 <- seq(10, 30, length=100)
popu_H0_norm <- dnorm(popu_H0, mean = 20, sd = 4)

popu_H0_df <- as.data.frame(cbind(popu_H0, popu_H0_norm))
plot_H0 <- ggplot(popu_H0_df, aes(x=popu_H0, y=popu_H0_norm))
plot_H0 <- plot_H0 +   # Here you need `<-` to update the plot 
  geom_line() +
  theme(
    text = element_text(size=20), 
    axis.title.x = element_text(vjust=0.1),
    axis.text.x = element_text(size = rel(1.8)),
    legend.position = "none",
    axis.title.y = element_blank(),
    axis.text.y = element_blank(),
    axis.ticks.y = element_blank(),
    axis.line.y = element_blank()
  ) +
  xlab("New label") +
  annotate("text", x = 20, y = 0.05, label = "Some annotation", size = 10) 

grid.arrange(plot_H0, plot_H0, plot_H0, ncol = 1, nrow = 3)

Upvotes: 1

Related Questions