0
votes

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

1
cowplot::plot_grid(p1, p2, nrow = 2, align = "v", axis = "lr")?Tung
That didn't fix it here, the y-axis title didn't change position.csgroen
Now I understand what you meant, just use the egg package thenTung
Thanks, I wasn't aware of the egg package. ggarrange worked perfectly. :) If you post it as an answer, I'll accept it.csgroen
already did. you just need to refresh this page :)Tung

1 Answers

1
votes

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)