How to automatically adjust the width of each facet for facet_wrap?

后端 未结 3 1264
情深已故
情深已故 2020-12-29 15:07

I want to plot a boxplot using ggplot2, and i have more than one facet, each facet has different terms, as follows:

library(ggplot2)

  p <- ggplot(
    d         


        
3条回答
  •  既然无缘
    2020-12-29 15:51

    While u/z-lin's answer works, there is a far simpler solution. Switch from facet_wrap(...) to use facet_grid(...). With facet_grid, you don't need to specify rows and columns. You are still able to specify scales= (which allows automatic adjustment of axis scales for each facet if wanted), but you can also specify space=, which does the same thing, but with the scaling of the overall facet width. This is what you want. Your function call is now something like this:

    ggplot(Data, aes(x = trait, y = mean)) +
        geom_boxplot(aes(
            fill = Ref, lower = mean-sd, upper = mean+sd, middle = mean, 
            ymin = min, ymax = max),
            lwd = 0.5, stat = "identity") +
        facet_grid(. ~ SP, scales = "free", space='free') +
        scale_x_discrete(expand = c(0, 0.5)) +
        theme_bw()
    

    Some more description of layout of facets can be found here.

    As @cdtip mentioned, this does not allow for independent y scales for each facet, which is what the OP asked for initially. Luckily, there is also a simple solution for this, which utilizes facet_row() from the ggforce package:

    library(ggforce)
    
    # same as above without facet_grid call..
    p <- ggplot(Data, aes(x = trait, y = mean)) +
      geom_boxplot(aes(
        fill = Ref, lower = mean-sd, upper = mean+sd, middle = mean, 
        ymin = min, ymax = max),
        lwd = 0.5, stat = "identity") +
      scale_x_discrete(expand = c(0, 0.5)) +
      theme_bw()
    
    p + ggforce::facet_row(vars(SP), scales = 'free', space = 'free')
    

提交回复
热议问题