9
votes

I'm trying to create a chart using facet_wrap with a facet_grid inside each of the wrapped facets but I'm unable to. Any suggestions?

For example, if I'm doing year-on-year comparisons for monthly averages of 2 quantities, I would like to have -

  • 2 facets, one for each quantity,
  • Each of the5 quantity facets has 12 facets inside of it for each of the months
  • Each month facet has two facets inside of it for each of the year

The closest I can come is this,

library(ggplot2)

# create dataset
df <- data.frame(
  Facet1 = rep(c(1,2,3),24),
  Facet2 = c(rep(1,24),rep(2,24)),
  Year = rep(c(rep(2012,12),rep(2013,12)),2),
  Month = rep(rep(1:12,2),2),
  ValueX = sample(0:5,144,replace = TRUE),
  ValueY = sample(0:5,144,replace = TRUE)
)

df <- df[!(df$Facet1 == 2 & df$Facet2 == 2),]

ggplot(df, aes(ValueX, ValueY)) + geom_point() +
    facet_grid(Facet2 + Year ~ Month)

enter image description here

While, what I would ideally like, is something along the lines of this (In my mind, analogous to ggplot() ... + facet_grid(Year ~ Month) + facet_wrap(Facet2~.)) -

enter image description here

PS: I think the facets in the latter are much more distinguishable and neater to go through. Comments? Any alternatives?

3
ggplot2 does not support this directly but someone with fancy grid skills could do this. You could also export the graphic and the the same thing in < minute with inkscape.Tyler Rinker
So, facet_grid gives you the plot you want, but you are not happy with the distances between facets and with the facet strips on the right and want to change them?Roland
@Roland - facet_grid(Year ~ Month) + facet_wrap(Facet2~.) is what I'm trying to achieve, so there are 2 facets for Facet2, and then each of those facets are then broken down into the 24 Year¬Month facets. The current methodology of facet_grid(Facet2 + Year ~ Month) accomplishes that as far as the eventual 48 facets are concerned, but lookwise, I think the second picture is a clearer faceting than the first one and allows for better readability.TheComeOnMan
I can only reiterate what Tyler said: ggplot2 doesn't support this. You can only change distances and facet strips of the plot with grid functionality.Roland
Thanks. Do you guys agree that this is cleaner though? Would it be useful to the general community if this were filed as a feature request?TheComeOnMan

3 Answers

3
votes

Maybe I'm misunderstanding what you're trying to do, but does this not achieve what you want?

ggplot(df, aes(ValueX, ValueY)) + geom_point() +
  facet_grid(Facet2 ~ Facet1)

If you want to change the facet titles to match your example have a look at the labeller argument of facet_grid().

0
votes

I am not sure to understand what you want to do , But I think it easier to get what you want using lattice` here:

library(latticeExtra)
xyplot(ValueY~ValueX|Facet1+Facet2,data=df, 
             between=list(x=2,y=0),
    par.settings = ggplot2like(),axis=axis.grid)

enter image description here

0
votes

This can easily be done using cowplot:

plot1<-ggplot(df[df$Facet2==1,], aes(ValueX, ValueY)) + geom_point() +
  facet_grid(Year ~ Month)+
  theme_bw()

plot2<-ggplot(df[df$Facet2==2,], aes(ValueX, ValueY)) + geom_point() +
  facet_grid(Year ~ Month)+
  theme_bw()

plot_grid(plot1, plot2, labels = c("1", "2"), nrow = 2)

enter image description here