csgroen
csgroen

Reputation: 2541

cowplot: axis title forcefully aligned when aligning two plots

This code replicates the problem:

library(ggplot2)

set.seed(0)
df <- data.frame(ID = letters[1:10],
                 Var = rnorm(10),
                 "Some_very_long_label_names" = rnorm(10),
                 "Not_so_long" = rnorm(10),
                 "Short" = rnorm(10),
                 "Incredibly_long_label_name_why_oh_why" = rnorm(10),
                 "Etc" = rnorm(10))
melted_df <- reshape2::melt(df)

p1 <- ggplot(df, aes(ID, Var)) +
    geom_bar(stat = "identity") +
    theme(axis.title.x = element_blank())

p2 <- ggplot(melted_df, aes(ID, variable)) +
    geom_tile(aes(fill = value)) +
    guides(fill = FALSE)

cowplot::plot_grid(p1, p2, nrow = 2, align = "v", axis = "n")

If you run that code, it'll yield this plot:

Problematic plot

The problem with this plot lies in the positioning of the y-axis title of the first plot. I thought perhaps setting axis = "n" would stop it from aligning to the axis from the second plot, but it didn't.

My desired output would be this plot, which has aligned the graphics but not the axis labels.

Desired output

Upvotes: 2

Views: 1390

Answers (1)

Tung
Tung

Reputation: 28361

You can use the egg package instead

library(ggplot2)

p1 <- ggplot(df, aes(ID, Var)) +
  geom_bar(stat = "identity") +
  scale_x_discrete(expand = c(0, 0)) +
  theme_bw() +
  theme(axis.title.x = element_blank())

p2 <- ggplot(melted_df, aes(ID, variable)) +
  geom_tile(aes(fill = value)) +
  scale_x_discrete(expand = c(0, 0)) +
  theme_bw() +
  guides(fill = FALSE)

library(egg)
#> Loading required package: gridExtra
ggarrange(p1, p2, nrow = 2)

Created on 2018-09-21 by the reprex package (v0.2.1.9000)

Upvotes: 2

Related Questions