Dmitry Zotikov
Dmitry Zotikov

Reputation: 2532

Multipanel plot with ggplot2?

I have bar charts faceted by stock symbol name:

barchart-by-symbol

I would like to be able to add a little "subplot" of an indicator below each plot, like this:

enter image description here

Is this possible with ggplot2? I thought of a secondary axis, but most often there is no linear relation between the main plot axis and the indicator axis (so using sec_axis is not an option).

Thanks!

Upvotes: 1

Views: 2459

Answers (1)

Chase
Chase

Reputation: 69151

Since these appear to be categorically different types of plots, I think you'll have better luck creating separate plots and then rendering them together. Here's one solution using cowplot package:

library(ggplot2)
library(cowplot)

#sample data
df <- data.frame(x = 1:100, y = cumsum(rnorm(100)), volume = sample(1:10, 100, replace = TRUE))
p1 <- ggplot(df, aes(x,y)) +
  geom_line()
p2 <- ggplot(df, aes(x,volume)) +
  geom_bar(stat = "identity")

plot_grid(p1, p2, align = "v", ncol = 1, rel_heights = c(.8, .2))

Created on 2019-01-25 by the reprex package (v0.2.1)

Edit

Continuing to build on this kludgy example to support the concept of faceting. Ignore the ugly graph, it's smooshed due to image size constraints.

library(ggplot2)
library(cowplot)
library(gridExtra)

#sample data
df <- data.frame(x = 1:100, y = cumsum(rnorm(100)), volume = sample(1:10, 400, replace = TRUE), group = letters[1:4])

plots <- list()

for (j in unique(df$group)){
  plot_df <- df[df$group == j, ]
  
  p1 <- ggplot(plot_df, aes(x,y)) +
    geom_line() +
    facet_wrap(~group) +
    xlab("")
  p2 <- ggplot(plot_df, aes(x,volume)) +
    geom_bar(stat = "identity")
  
  p_out <- plot_grid(p1, p2, align = "v", ncol = 1, rel_heights = c(.7, .3))
  
  plots[[j]] <- p_out
  
}

do.call(grid.arrange, plots)

Created on 2019-01-25 by the reprex package (v0.2.1)

Upvotes: 1

Related Questions