How to position strip labels in facet_wrap like in facet_grid Announcing the arrival of Valued Associate #679: Cesar Manara Planned maintenance scheduled April 23, 2019 at 23:30 UTC (7:30pm US/Eastern) Data science time! April 2019 and salary with experience The Ask Question Wizard is Live!Scaling with `scales='free_y'` does not work with `facet_grid`ggplot2, facet_grid, free scales?How can I manipulate the strip text of facet_grid plots?How to specify columns in facet_grid OR how to change labels in facet_wrapggplot2 strip text labels facet_wrapcontrolling order of facet_grid/facet_wrap in ggplot2?What's the difference between facet_wrap() and facet_grid() in ggplot2?Why does facet_grid work, but not facet_wrap?Mixing facet_grid() and facet_wrap() in ggplot2Year to Year-Month-Day format'Labels on top' with facet_grid, or 'space option' with facet_wrapset “space” in facet_wrap like in facet_grid

Flight departed from the gate 5 min before scheduled departure time. Refund options

What does 丫 mean? 丫是什么意思?

How would you say "es muy psicólogo"?

Test print coming out spongy

How much damage would a cupful of neutron star matter do to the Earth?

New Order #6: Easter Egg

Positioning dot before text in math mode

Central Vacuuming: Is it worth it, and how does it compare to normal vacuuming?

How do living politicians protect their readily obtainable signatures from misuse?

Are the endpoints of the domain of a function counted as critical points?

Google .dev domain strangely redirects to https

Why not send Voyager 3 and 4 following up the paths taken by Voyager 1 and 2 to re-transmit signals of later as they fly away from Earth?

What does it mean that physics no longer uses mechanical models to describe phenomena?

"klopfte jemand" or "jemand klopfte"?

How to force a browser when connecting to a specific domain to be https only using only the client machine?

How were pictures turned from film to a big picture in a picture frame before digital scanning?

I can't produce songs

In musical terms, what properties are varied by the human voice to produce different words / syllables?

retrieve food groups from food item list

Tips to organize LaTeX presentations for a semester

Why are vacuum tubes still used in amateur radios?

Is CEO the "profession" with the most psychopaths?

Why weren't discrete x86 CPUs ever used in game hardware?

What is the chair depicted in Cesare Maccari's 1889 painting "Cicerone denuncia Catilina"?



How to position strip labels in facet_wrap like in facet_grid



Announcing the arrival of Valued Associate #679: Cesar Manara
Planned maintenance scheduled April 23, 2019 at 23:30 UTC (7:30pm US/Eastern)
Data science time! April 2019 and salary with experience
The Ask Question Wizard is Live!Scaling with `scales='free_y'` does not work with `facet_grid`ggplot2, facet_grid, free scales?How can I manipulate the strip text of facet_grid plots?How to specify columns in facet_grid OR how to change labels in facet_wrapggplot2 strip text labels facet_wrapcontrolling order of facet_grid/facet_wrap in ggplot2?What's the difference between facet_wrap() and facet_grid() in ggplot2?Why does facet_grid work, but not facet_wrap?Mixing facet_grid() and facet_wrap() in ggplot2Year to Year-Month-Day format'Labels on top' with facet_grid, or 'space option' with facet_wrapset “space” in facet_wrap like in facet_grid



.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty height:90px;width:728px;box-sizing:border-box;








4















I would like to remove the redundancy of strip labels when using facet_wrap() and faceting with two variables and both scales free.



For example, this facet_wrap version of the following graph



library(ggplot2)
dt <- txhousing[txhousing$year %in% 2000:2002 & txhousing$month %in% 1:3,]

ggplot(dt, aes(median, sales)) +
geom_point() +
facet_wrap(c("year", "month"),
labeller = "label_both",
scales = "free")


facet_wrap_version



should have the looks of this facet_grid version of it, where the strip labels are at the top and right edge of the graph (could be bottom and left edge as well).



ggplot(dt, aes(median, sales)) +
geom_point() +
facet_grid(c("year", "month"),
labeller = "label_both",
scales = "free")


enter image description here



Unfortunately, using facet_grid is not an option because, as far as I understand, it doesn't allow scales to be "completely free" - see here or here



One attempt that I thought about would be to produce separate plots and then combine them:



library(cowplot)
theme_set(theme_gray())

p1 <- ggplot(dt[dt$year == 2000,], aes(median, sales)) +
geom_point() +
facet_wrap("month", scales = "free") +
labs(y = "2000") +
theme(axis.title.x = element_blank())

p2 <- ggplot(dt[dt$year == 2001,], aes(median, sales)) +
geom_point() +
facet_wrap("month", scales = "free") +
labs(y = "2001") +
theme(strip.background = element_blank(),
strip.text.x = element_blank(),
axis.title.x = element_blank())

p3 <- ggplot(dt[dt$year == 2002,], aes(median, sales)) +
geom_point() +
facet_wrap("month", scales = "free") +
labs(y = "2002") +
theme(strip.background = element_blank(),
strip.text.x = element_blank())

plot_grid(p1, p2, p3, nrow = 3)


enter image description here



I am ok with the above hackish attempt, but I wonder if there is something in facet_wrap that could allow the desired output. I feel that I miss something obvious about it and maybe my search for an answer didn't include the proper key words (I have the feeling that this question was addressed before).










share|improve this question




























    4















    I would like to remove the redundancy of strip labels when using facet_wrap() and faceting with two variables and both scales free.



    For example, this facet_wrap version of the following graph



    library(ggplot2)
    dt <- txhousing[txhousing$year %in% 2000:2002 & txhousing$month %in% 1:3,]

    ggplot(dt, aes(median, sales)) +
    geom_point() +
    facet_wrap(c("year", "month"),
    labeller = "label_both",
    scales = "free")


    facet_wrap_version



    should have the looks of this facet_grid version of it, where the strip labels are at the top and right edge of the graph (could be bottom and left edge as well).



    ggplot(dt, aes(median, sales)) +
    geom_point() +
    facet_grid(c("year", "month"),
    labeller = "label_both",
    scales = "free")


    enter image description here



    Unfortunately, using facet_grid is not an option because, as far as I understand, it doesn't allow scales to be "completely free" - see here or here



    One attempt that I thought about would be to produce separate plots and then combine them:



    library(cowplot)
    theme_set(theme_gray())

    p1 <- ggplot(dt[dt$year == 2000,], aes(median, sales)) +
    geom_point() +
    facet_wrap("month", scales = "free") +
    labs(y = "2000") +
    theme(axis.title.x = element_blank())

    p2 <- ggplot(dt[dt$year == 2001,], aes(median, sales)) +
    geom_point() +
    facet_wrap("month", scales = "free") +
    labs(y = "2001") +
    theme(strip.background = element_blank(),
    strip.text.x = element_blank(),
    axis.title.x = element_blank())

    p3 <- ggplot(dt[dt$year == 2002,], aes(median, sales)) +
    geom_point() +
    facet_wrap("month", scales = "free") +
    labs(y = "2002") +
    theme(strip.background = element_blank(),
    strip.text.x = element_blank())

    plot_grid(p1, p2, p3, nrow = 3)


    enter image description here



    I am ok with the above hackish attempt, but I wonder if there is something in facet_wrap that could allow the desired output. I feel that I miss something obvious about it and maybe my search for an answer didn't include the proper key words (I have the feeling that this question was addressed before).










    share|improve this question
























      4












      4








      4


      1






      I would like to remove the redundancy of strip labels when using facet_wrap() and faceting with two variables and both scales free.



      For example, this facet_wrap version of the following graph



      library(ggplot2)
      dt <- txhousing[txhousing$year %in% 2000:2002 & txhousing$month %in% 1:3,]

      ggplot(dt, aes(median, sales)) +
      geom_point() +
      facet_wrap(c("year", "month"),
      labeller = "label_both",
      scales = "free")


      facet_wrap_version



      should have the looks of this facet_grid version of it, where the strip labels are at the top and right edge of the graph (could be bottom and left edge as well).



      ggplot(dt, aes(median, sales)) +
      geom_point() +
      facet_grid(c("year", "month"),
      labeller = "label_both",
      scales = "free")


      enter image description here



      Unfortunately, using facet_grid is not an option because, as far as I understand, it doesn't allow scales to be "completely free" - see here or here



      One attempt that I thought about would be to produce separate plots and then combine them:



      library(cowplot)
      theme_set(theme_gray())

      p1 <- ggplot(dt[dt$year == 2000,], aes(median, sales)) +
      geom_point() +
      facet_wrap("month", scales = "free") +
      labs(y = "2000") +
      theme(axis.title.x = element_blank())

      p2 <- ggplot(dt[dt$year == 2001,], aes(median, sales)) +
      geom_point() +
      facet_wrap("month", scales = "free") +
      labs(y = "2001") +
      theme(strip.background = element_blank(),
      strip.text.x = element_blank(),
      axis.title.x = element_blank())

      p3 <- ggplot(dt[dt$year == 2002,], aes(median, sales)) +
      geom_point() +
      facet_wrap("month", scales = "free") +
      labs(y = "2002") +
      theme(strip.background = element_blank(),
      strip.text.x = element_blank())

      plot_grid(p1, p2, p3, nrow = 3)


      enter image description here



      I am ok with the above hackish attempt, but I wonder if there is something in facet_wrap that could allow the desired output. I feel that I miss something obvious about it and maybe my search for an answer didn't include the proper key words (I have the feeling that this question was addressed before).










      share|improve this question














      I would like to remove the redundancy of strip labels when using facet_wrap() and faceting with two variables and both scales free.



      For example, this facet_wrap version of the following graph



      library(ggplot2)
      dt <- txhousing[txhousing$year %in% 2000:2002 & txhousing$month %in% 1:3,]

      ggplot(dt, aes(median, sales)) +
      geom_point() +
      facet_wrap(c("year", "month"),
      labeller = "label_both",
      scales = "free")


      facet_wrap_version



      should have the looks of this facet_grid version of it, where the strip labels are at the top and right edge of the graph (could be bottom and left edge as well).



      ggplot(dt, aes(median, sales)) +
      geom_point() +
      facet_grid(c("year", "month"),
      labeller = "label_both",
      scales = "free")


      enter image description here



      Unfortunately, using facet_grid is not an option because, as far as I understand, it doesn't allow scales to be "completely free" - see here or here



      One attempt that I thought about would be to produce separate plots and then combine them:



      library(cowplot)
      theme_set(theme_gray())

      p1 <- ggplot(dt[dt$year == 2000,], aes(median, sales)) +
      geom_point() +
      facet_wrap("month", scales = "free") +
      labs(y = "2000") +
      theme(axis.title.x = element_blank())

      p2 <- ggplot(dt[dt$year == 2001,], aes(median, sales)) +
      geom_point() +
      facet_wrap("month", scales = "free") +
      labs(y = "2001") +
      theme(strip.background = element_blank(),
      strip.text.x = element_blank(),
      axis.title.x = element_blank())

      p3 <- ggplot(dt[dt$year == 2002,], aes(median, sales)) +
      geom_point() +
      facet_wrap("month", scales = "free") +
      labs(y = "2002") +
      theme(strip.background = element_blank(),
      strip.text.x = element_blank())

      plot_grid(p1, p2, p3, nrow = 3)


      enter image description here



      I am ok with the above hackish attempt, but I wonder if there is something in facet_wrap that could allow the desired output. I feel that I miss something obvious about it and maybe my search for an answer didn't include the proper key words (I have the feeling that this question was addressed before).







      r ggplot2






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked Oct 8 '18 at 16:34









      ValentinValentin

      2,2921632




      2,2921632






















          2 Answers
          2






          active

          oldest

          votes


















          1














          This does not seem easy, but one way is to use grid graphics to insert panel strips from a facet_grid plot into one created as a facet_wrap. Something like this:



          First lets create two plots using facet_grid and facet_wrap.



          dt <- txhousing[txhousing$year %in% 2000:2002 & txhousing$month %in% 1:3,]

          g1 = ggplot(dt, aes(median, sales)) +
          geom_point() +
          facet_wrap(c("year", "month"), scales = "free") +
          theme(strip.background = element_blank(),
          strip.text = element_blank())

          g2 = ggplot(dt, aes(median, sales)) +
          geom_point() +
          facet_grid(c("year", "month"), scales = "free")


          Now we can fairly easily replace the top facet strips of g1 with those from g2



          library(grid)
          library(gtable)
          gt1 = ggplot_gtable(ggplot_build(g1))
          gt2 = ggplot_gtable(ggplot_build(g2))
          gt1$grobs[grep('strip-t.+1$', gt1$layout$name)] = gt2$grobs[grep('strip-t', gt2$layout$name)]
          grid.draw(gt1)


          enter image description here



          Adding the right hand panel strips need us to first add a new column in the grid layout, then paste the relevant strip grobs into it:



          gt1 = gtable_add_cols(gt1, widths=gt.side1$widths[1], pos = -1)

          panel_id <- gt1$layout[grep('panel-.+1$', gt1$layout$name),]
          gt.side1 = gtable_filter(gt2, 'strip-r-1')
          gt.side2 = gtable_filter(gt2, 'strip-r-2')
          gt.side3 = gtable_filter(gt2, 'strip-r-3')
          gt1 = gtable_add_grob(gt1, zeroGrob(), t = 1, l = ncol(gt1), b=nrow(gt1))
          gt1 = gtable_add_grob(gt1, gt.side1, t = panel_id$t[1], l = ncol(gt1))
          gt1 = gtable_add_grob(gt1, gt.side2, t = panel_id$t[2], l = ncol(gt1))
          gt1 = gtable_add_grob(gt1, gt.side3, t = panel_id$t[3], l = ncol(gt1))

          grid.newpage()
          grid.draw(gt1)


          enter image description here






          share|improve this answer


















          • 1





            Hi @dww. Sorry for the delay. I like your two steps approach. I tried it out and works with a minor edit - I think you need to replace gt.side1$widths[1] with gt1$widths[1] when you edit gt1 by adding a new column.

            – Valentin
            Oct 26 '18 at 18:34











          • I didn't notice so far, but when you overwrite gt1$grobs with gt2$grobs, it overlays some of the top points of the upper panels. I think first a top row should be added gt1 <- gtable_add_rows(gt1, heights = unit(0.5, 'cm'), pos = 2) and then add the top facet labels with something like gt1 <- gtable_add_grob(gt1, grobs = gt2$grobs[grep('strip-t', gt2$layout$name)], t = 2, l = gt1$layout[grep('strip-t.+1$', gt1$layout$name),]$l)

            – Valentin
            Oct 29 '18 at 4:31



















          3














          I am not sure you can do this by just using facet_wrap, so probably your attempt is the way to go. But IMO it needs an improvement. Presently, you are missing actual y-lab (sales) and it kinda misguides what is plotted in y- axis



          You could improve what you are doing by adding another plot title row by using gtable and grid.



          p1 <- ggplot(dt[dt$year == 2000,], aes(median, sales)) +
          geom_point() +
          facet_wrap("month", scales = "free") +
          theme(axis.title.x = element_blank())

          p2 <- ggplot(dt[dt$year == 2001,], aes(median, sales)) +
          geom_point() +
          facet_wrap("month", scales = "free") +
          theme(axis.title.x = element_blank())

          p3 <- ggplot(dt[dt$year == 2002,], aes(median, sales)) +
          geom_point() +
          facet_wrap("month", scales = "free")


          Note that the labs are removed from the above plots.



          if ( !require(grid) ) install.packages("grid"); library(grid) 
          if ( !require(gtable ) ) install.packages("gtable"); library(gtable)

          z1 <- ggplotGrob(p1) # Generate a ggplot2 plot grob
          z1 <- gtable_add_rows(z1, unit(0.6, 'cm'), 2) # add new rows in specified position

          z1 <- gtable_add_grob(z1,
          list(rectGrob(gp = gpar(col = NA, fill = gray(0.7))),
          textGrob("2000", gp = gpar(col = "black",cex=0.9))),
          t=2, l=4, b=3, r=13, name = paste(runif(2))) #add grobs into the table


          Note that in step 3, getting the exact values for t (top extent), l(left extent), b (bottom extent) and r(right extent) might need trial and error method



          Now repeat the above steps for p2 and p3



          z2 <- ggplotGrob(p2)
          z2 <- gtable_add_rows(z2, unit(0.6, 'cm'), 2)

          z2 <- gtable_add_grob(z2,
          list(rectGrob(gp = gpar(col = NA, fill = gray(0.7))),
          textGrob("2001", gp = gpar(col = "black",cex=0.9))),
          t=2, l=4, b=3, r=13, name = paste(runif(2)))

          z3 <- ggplotGrob(p3)
          z3 <- gtable_add_rows(z3, unit(0.6, 'cm'), 2)

          z3 <- gtable_add_grob(z3,
          list(rectGrob(gp = gpar(col = NA, fill = gray(0.7))),
          textGrob("2002", gp = gpar(col = "black",cex=0.9))),
          t=2, l=4, b=3, r=13, name = paste(runif(2)))


          finally, plotting



          plot_grid(z1, z2, z3, nrow = 3)


          enter image description here



          You can also have the years indicated in the column like in facet_grid instead of row. In that case, you have to add a column by using gtable_add_cols. But make sure to (a) add the column at the correct position in step-2, and (b) get the correct values for t, l, b and r in step-3.






          share|improve this answer

























          • plot_grid seems to be deprecated, is there an updated alternative to this?

            – EuGENE
            Mar 20 at 16:58











          Your Answer






          StackExchange.ifUsing("editor", function ()
          StackExchange.using("externalEditor", function ()
          StackExchange.using("snippets", function ()
          StackExchange.snippets.init();
          );
          );
          , "code-snippets");

          StackExchange.ready(function()
          var channelOptions =
          tags: "".split(" "),
          id: "1"
          ;
          initTagRenderer("".split(" "), "".split(" "), channelOptions);

          StackExchange.using("externalEditor", function()
          // Have to fire editor after snippets, if snippets enabled
          if (StackExchange.settings.snippets.snippetsEnabled)
          StackExchange.using("snippets", function()
          createEditor();
          );

          else
          createEditor();

          );

          function createEditor()
          StackExchange.prepareEditor(
          heartbeatType: 'answer',
          autoActivateHeartbeat: false,
          convertImagesToLinks: true,
          noModals: true,
          showLowRepImageUploadWarning: true,
          reputationToPostImages: 10,
          bindNavPrevention: true,
          postfix: "",
          imageUploader:
          brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
          contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
          allowUrls: true
          ,
          onDemand: true,
          discardSelector: ".discard-answer"
          ,immediatelyShowMarkdownHelp:true
          );



          );













          draft saved

          draft discarded


















          StackExchange.ready(
          function ()
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f52706599%2fhow-to-position-strip-labels-in-facet-wrap-like-in-facet-grid%23new-answer', 'question_page');

          );

          Post as a guest















          Required, but never shown

























          2 Answers
          2






          active

          oldest

          votes








          2 Answers
          2






          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes









          1














          This does not seem easy, but one way is to use grid graphics to insert panel strips from a facet_grid plot into one created as a facet_wrap. Something like this:



          First lets create two plots using facet_grid and facet_wrap.



          dt <- txhousing[txhousing$year %in% 2000:2002 & txhousing$month %in% 1:3,]

          g1 = ggplot(dt, aes(median, sales)) +
          geom_point() +
          facet_wrap(c("year", "month"), scales = "free") +
          theme(strip.background = element_blank(),
          strip.text = element_blank())

          g2 = ggplot(dt, aes(median, sales)) +
          geom_point() +
          facet_grid(c("year", "month"), scales = "free")


          Now we can fairly easily replace the top facet strips of g1 with those from g2



          library(grid)
          library(gtable)
          gt1 = ggplot_gtable(ggplot_build(g1))
          gt2 = ggplot_gtable(ggplot_build(g2))
          gt1$grobs[grep('strip-t.+1$', gt1$layout$name)] = gt2$grobs[grep('strip-t', gt2$layout$name)]
          grid.draw(gt1)


          enter image description here



          Adding the right hand panel strips need us to first add a new column in the grid layout, then paste the relevant strip grobs into it:



          gt1 = gtable_add_cols(gt1, widths=gt.side1$widths[1], pos = -1)

          panel_id <- gt1$layout[grep('panel-.+1$', gt1$layout$name),]
          gt.side1 = gtable_filter(gt2, 'strip-r-1')
          gt.side2 = gtable_filter(gt2, 'strip-r-2')
          gt.side3 = gtable_filter(gt2, 'strip-r-3')
          gt1 = gtable_add_grob(gt1, zeroGrob(), t = 1, l = ncol(gt1), b=nrow(gt1))
          gt1 = gtable_add_grob(gt1, gt.side1, t = panel_id$t[1], l = ncol(gt1))
          gt1 = gtable_add_grob(gt1, gt.side2, t = panel_id$t[2], l = ncol(gt1))
          gt1 = gtable_add_grob(gt1, gt.side3, t = panel_id$t[3], l = ncol(gt1))

          grid.newpage()
          grid.draw(gt1)


          enter image description here






          share|improve this answer


















          • 1





            Hi @dww. Sorry for the delay. I like your two steps approach. I tried it out and works with a minor edit - I think you need to replace gt.side1$widths[1] with gt1$widths[1] when you edit gt1 by adding a new column.

            – Valentin
            Oct 26 '18 at 18:34











          • I didn't notice so far, but when you overwrite gt1$grobs with gt2$grobs, it overlays some of the top points of the upper panels. I think first a top row should be added gt1 <- gtable_add_rows(gt1, heights = unit(0.5, 'cm'), pos = 2) and then add the top facet labels with something like gt1 <- gtable_add_grob(gt1, grobs = gt2$grobs[grep('strip-t', gt2$layout$name)], t = 2, l = gt1$layout[grep('strip-t.+1$', gt1$layout$name),]$l)

            – Valentin
            Oct 29 '18 at 4:31
















          1














          This does not seem easy, but one way is to use grid graphics to insert panel strips from a facet_grid plot into one created as a facet_wrap. Something like this:



          First lets create two plots using facet_grid and facet_wrap.



          dt <- txhousing[txhousing$year %in% 2000:2002 & txhousing$month %in% 1:3,]

          g1 = ggplot(dt, aes(median, sales)) +
          geom_point() +
          facet_wrap(c("year", "month"), scales = "free") +
          theme(strip.background = element_blank(),
          strip.text = element_blank())

          g2 = ggplot(dt, aes(median, sales)) +
          geom_point() +
          facet_grid(c("year", "month"), scales = "free")


          Now we can fairly easily replace the top facet strips of g1 with those from g2



          library(grid)
          library(gtable)
          gt1 = ggplot_gtable(ggplot_build(g1))
          gt2 = ggplot_gtable(ggplot_build(g2))
          gt1$grobs[grep('strip-t.+1$', gt1$layout$name)] = gt2$grobs[grep('strip-t', gt2$layout$name)]
          grid.draw(gt1)


          enter image description here



          Adding the right hand panel strips need us to first add a new column in the grid layout, then paste the relevant strip grobs into it:



          gt1 = gtable_add_cols(gt1, widths=gt.side1$widths[1], pos = -1)

          panel_id <- gt1$layout[grep('panel-.+1$', gt1$layout$name),]
          gt.side1 = gtable_filter(gt2, 'strip-r-1')
          gt.side2 = gtable_filter(gt2, 'strip-r-2')
          gt.side3 = gtable_filter(gt2, 'strip-r-3')
          gt1 = gtable_add_grob(gt1, zeroGrob(), t = 1, l = ncol(gt1), b=nrow(gt1))
          gt1 = gtable_add_grob(gt1, gt.side1, t = panel_id$t[1], l = ncol(gt1))
          gt1 = gtable_add_grob(gt1, gt.side2, t = panel_id$t[2], l = ncol(gt1))
          gt1 = gtable_add_grob(gt1, gt.side3, t = panel_id$t[3], l = ncol(gt1))

          grid.newpage()
          grid.draw(gt1)


          enter image description here






          share|improve this answer


















          • 1





            Hi @dww. Sorry for the delay. I like your two steps approach. I tried it out and works with a minor edit - I think you need to replace gt.side1$widths[1] with gt1$widths[1] when you edit gt1 by adding a new column.

            – Valentin
            Oct 26 '18 at 18:34











          • I didn't notice so far, but when you overwrite gt1$grobs with gt2$grobs, it overlays some of the top points of the upper panels. I think first a top row should be added gt1 <- gtable_add_rows(gt1, heights = unit(0.5, 'cm'), pos = 2) and then add the top facet labels with something like gt1 <- gtable_add_grob(gt1, grobs = gt2$grobs[grep('strip-t', gt2$layout$name)], t = 2, l = gt1$layout[grep('strip-t.+1$', gt1$layout$name),]$l)

            – Valentin
            Oct 29 '18 at 4:31














          1












          1








          1







          This does not seem easy, but one way is to use grid graphics to insert panel strips from a facet_grid plot into one created as a facet_wrap. Something like this:



          First lets create two plots using facet_grid and facet_wrap.



          dt <- txhousing[txhousing$year %in% 2000:2002 & txhousing$month %in% 1:3,]

          g1 = ggplot(dt, aes(median, sales)) +
          geom_point() +
          facet_wrap(c("year", "month"), scales = "free") +
          theme(strip.background = element_blank(),
          strip.text = element_blank())

          g2 = ggplot(dt, aes(median, sales)) +
          geom_point() +
          facet_grid(c("year", "month"), scales = "free")


          Now we can fairly easily replace the top facet strips of g1 with those from g2



          library(grid)
          library(gtable)
          gt1 = ggplot_gtable(ggplot_build(g1))
          gt2 = ggplot_gtable(ggplot_build(g2))
          gt1$grobs[grep('strip-t.+1$', gt1$layout$name)] = gt2$grobs[grep('strip-t', gt2$layout$name)]
          grid.draw(gt1)


          enter image description here



          Adding the right hand panel strips need us to first add a new column in the grid layout, then paste the relevant strip grobs into it:



          gt1 = gtable_add_cols(gt1, widths=gt.side1$widths[1], pos = -1)

          panel_id <- gt1$layout[grep('panel-.+1$', gt1$layout$name),]
          gt.side1 = gtable_filter(gt2, 'strip-r-1')
          gt.side2 = gtable_filter(gt2, 'strip-r-2')
          gt.side3 = gtable_filter(gt2, 'strip-r-3')
          gt1 = gtable_add_grob(gt1, zeroGrob(), t = 1, l = ncol(gt1), b=nrow(gt1))
          gt1 = gtable_add_grob(gt1, gt.side1, t = panel_id$t[1], l = ncol(gt1))
          gt1 = gtable_add_grob(gt1, gt.side2, t = panel_id$t[2], l = ncol(gt1))
          gt1 = gtable_add_grob(gt1, gt.side3, t = panel_id$t[3], l = ncol(gt1))

          grid.newpage()
          grid.draw(gt1)


          enter image description here






          share|improve this answer













          This does not seem easy, but one way is to use grid graphics to insert panel strips from a facet_grid plot into one created as a facet_wrap. Something like this:



          First lets create two plots using facet_grid and facet_wrap.



          dt <- txhousing[txhousing$year %in% 2000:2002 & txhousing$month %in% 1:3,]

          g1 = ggplot(dt, aes(median, sales)) +
          geom_point() +
          facet_wrap(c("year", "month"), scales = "free") +
          theme(strip.background = element_blank(),
          strip.text = element_blank())

          g2 = ggplot(dt, aes(median, sales)) +
          geom_point() +
          facet_grid(c("year", "month"), scales = "free")


          Now we can fairly easily replace the top facet strips of g1 with those from g2



          library(grid)
          library(gtable)
          gt1 = ggplot_gtable(ggplot_build(g1))
          gt2 = ggplot_gtable(ggplot_build(g2))
          gt1$grobs[grep('strip-t.+1$', gt1$layout$name)] = gt2$grobs[grep('strip-t', gt2$layout$name)]
          grid.draw(gt1)


          enter image description here



          Adding the right hand panel strips need us to first add a new column in the grid layout, then paste the relevant strip grobs into it:



          gt1 = gtable_add_cols(gt1, widths=gt.side1$widths[1], pos = -1)

          panel_id <- gt1$layout[grep('panel-.+1$', gt1$layout$name),]
          gt.side1 = gtable_filter(gt2, 'strip-r-1')
          gt.side2 = gtable_filter(gt2, 'strip-r-2')
          gt.side3 = gtable_filter(gt2, 'strip-r-3')
          gt1 = gtable_add_grob(gt1, zeroGrob(), t = 1, l = ncol(gt1), b=nrow(gt1))
          gt1 = gtable_add_grob(gt1, gt.side1, t = panel_id$t[1], l = ncol(gt1))
          gt1 = gtable_add_grob(gt1, gt.side2, t = panel_id$t[2], l = ncol(gt1))
          gt1 = gtable_add_grob(gt1, gt.side3, t = panel_id$t[3], l = ncol(gt1))

          grid.newpage()
          grid.draw(gt1)


          enter image description here







          share|improve this answer












          share|improve this answer



          share|improve this answer










          answered Oct 8 '18 at 19:18









          dwwdww

          16.2k32660




          16.2k32660







          • 1





            Hi @dww. Sorry for the delay. I like your two steps approach. I tried it out and works with a minor edit - I think you need to replace gt.side1$widths[1] with gt1$widths[1] when you edit gt1 by adding a new column.

            – Valentin
            Oct 26 '18 at 18:34











          • I didn't notice so far, but when you overwrite gt1$grobs with gt2$grobs, it overlays some of the top points of the upper panels. I think first a top row should be added gt1 <- gtable_add_rows(gt1, heights = unit(0.5, 'cm'), pos = 2) and then add the top facet labels with something like gt1 <- gtable_add_grob(gt1, grobs = gt2$grobs[grep('strip-t', gt2$layout$name)], t = 2, l = gt1$layout[grep('strip-t.+1$', gt1$layout$name),]$l)

            – Valentin
            Oct 29 '18 at 4:31













          • 1





            Hi @dww. Sorry for the delay. I like your two steps approach. I tried it out and works with a minor edit - I think you need to replace gt.side1$widths[1] with gt1$widths[1] when you edit gt1 by adding a new column.

            – Valentin
            Oct 26 '18 at 18:34











          • I didn't notice so far, but when you overwrite gt1$grobs with gt2$grobs, it overlays some of the top points of the upper panels. I think first a top row should be added gt1 <- gtable_add_rows(gt1, heights = unit(0.5, 'cm'), pos = 2) and then add the top facet labels with something like gt1 <- gtable_add_grob(gt1, grobs = gt2$grobs[grep('strip-t', gt2$layout$name)], t = 2, l = gt1$layout[grep('strip-t.+1$', gt1$layout$name),]$l)

            – Valentin
            Oct 29 '18 at 4:31








          1




          1





          Hi @dww. Sorry for the delay. I like your two steps approach. I tried it out and works with a minor edit - I think you need to replace gt.side1$widths[1] with gt1$widths[1] when you edit gt1 by adding a new column.

          – Valentin
          Oct 26 '18 at 18:34





          Hi @dww. Sorry for the delay. I like your two steps approach. I tried it out and works with a minor edit - I think you need to replace gt.side1$widths[1] with gt1$widths[1] when you edit gt1 by adding a new column.

          – Valentin
          Oct 26 '18 at 18:34













          I didn't notice so far, but when you overwrite gt1$grobs with gt2$grobs, it overlays some of the top points of the upper panels. I think first a top row should be added gt1 <- gtable_add_rows(gt1, heights = unit(0.5, 'cm'), pos = 2) and then add the top facet labels with something like gt1 <- gtable_add_grob(gt1, grobs = gt2$grobs[grep('strip-t', gt2$layout$name)], t = 2, l = gt1$layout[grep('strip-t.+1$', gt1$layout$name),]$l)

          – Valentin
          Oct 29 '18 at 4:31






          I didn't notice so far, but when you overwrite gt1$grobs with gt2$grobs, it overlays some of the top points of the upper panels. I think first a top row should be added gt1 <- gtable_add_rows(gt1, heights = unit(0.5, 'cm'), pos = 2) and then add the top facet labels with something like gt1 <- gtable_add_grob(gt1, grobs = gt2$grobs[grep('strip-t', gt2$layout$name)], t = 2, l = gt1$layout[grep('strip-t.+1$', gt1$layout$name),]$l)

          – Valentin
          Oct 29 '18 at 4:31














          3














          I am not sure you can do this by just using facet_wrap, so probably your attempt is the way to go. But IMO it needs an improvement. Presently, you are missing actual y-lab (sales) and it kinda misguides what is plotted in y- axis



          You could improve what you are doing by adding another plot title row by using gtable and grid.



          p1 <- ggplot(dt[dt$year == 2000,], aes(median, sales)) +
          geom_point() +
          facet_wrap("month", scales = "free") +
          theme(axis.title.x = element_blank())

          p2 <- ggplot(dt[dt$year == 2001,], aes(median, sales)) +
          geom_point() +
          facet_wrap("month", scales = "free") +
          theme(axis.title.x = element_blank())

          p3 <- ggplot(dt[dt$year == 2002,], aes(median, sales)) +
          geom_point() +
          facet_wrap("month", scales = "free")


          Note that the labs are removed from the above plots.



          if ( !require(grid) ) install.packages("grid"); library(grid) 
          if ( !require(gtable ) ) install.packages("gtable"); library(gtable)

          z1 <- ggplotGrob(p1) # Generate a ggplot2 plot grob
          z1 <- gtable_add_rows(z1, unit(0.6, 'cm'), 2) # add new rows in specified position

          z1 <- gtable_add_grob(z1,
          list(rectGrob(gp = gpar(col = NA, fill = gray(0.7))),
          textGrob("2000", gp = gpar(col = "black",cex=0.9))),
          t=2, l=4, b=3, r=13, name = paste(runif(2))) #add grobs into the table


          Note that in step 3, getting the exact values for t (top extent), l(left extent), b (bottom extent) and r(right extent) might need trial and error method



          Now repeat the above steps for p2 and p3



          z2 <- ggplotGrob(p2)
          z2 <- gtable_add_rows(z2, unit(0.6, 'cm'), 2)

          z2 <- gtable_add_grob(z2,
          list(rectGrob(gp = gpar(col = NA, fill = gray(0.7))),
          textGrob("2001", gp = gpar(col = "black",cex=0.9))),
          t=2, l=4, b=3, r=13, name = paste(runif(2)))

          z3 <- ggplotGrob(p3)
          z3 <- gtable_add_rows(z3, unit(0.6, 'cm'), 2)

          z3 <- gtable_add_grob(z3,
          list(rectGrob(gp = gpar(col = NA, fill = gray(0.7))),
          textGrob("2002", gp = gpar(col = "black",cex=0.9))),
          t=2, l=4, b=3, r=13, name = paste(runif(2)))


          finally, plotting



          plot_grid(z1, z2, z3, nrow = 3)


          enter image description here



          You can also have the years indicated in the column like in facet_grid instead of row. In that case, you have to add a column by using gtable_add_cols. But make sure to (a) add the column at the correct position in step-2, and (b) get the correct values for t, l, b and r in step-3.






          share|improve this answer

























          • plot_grid seems to be deprecated, is there an updated alternative to this?

            – EuGENE
            Mar 20 at 16:58















          3














          I am not sure you can do this by just using facet_wrap, so probably your attempt is the way to go. But IMO it needs an improvement. Presently, you are missing actual y-lab (sales) and it kinda misguides what is plotted in y- axis



          You could improve what you are doing by adding another plot title row by using gtable and grid.



          p1 <- ggplot(dt[dt$year == 2000,], aes(median, sales)) +
          geom_point() +
          facet_wrap("month", scales = "free") +
          theme(axis.title.x = element_blank())

          p2 <- ggplot(dt[dt$year == 2001,], aes(median, sales)) +
          geom_point() +
          facet_wrap("month", scales = "free") +
          theme(axis.title.x = element_blank())

          p3 <- ggplot(dt[dt$year == 2002,], aes(median, sales)) +
          geom_point() +
          facet_wrap("month", scales = "free")


          Note that the labs are removed from the above plots.



          if ( !require(grid) ) install.packages("grid"); library(grid) 
          if ( !require(gtable ) ) install.packages("gtable"); library(gtable)

          z1 <- ggplotGrob(p1) # Generate a ggplot2 plot grob
          z1 <- gtable_add_rows(z1, unit(0.6, 'cm'), 2) # add new rows in specified position

          z1 <- gtable_add_grob(z1,
          list(rectGrob(gp = gpar(col = NA, fill = gray(0.7))),
          textGrob("2000", gp = gpar(col = "black",cex=0.9))),
          t=2, l=4, b=3, r=13, name = paste(runif(2))) #add grobs into the table


          Note that in step 3, getting the exact values for t (top extent), l(left extent), b (bottom extent) and r(right extent) might need trial and error method



          Now repeat the above steps for p2 and p3



          z2 <- ggplotGrob(p2)
          z2 <- gtable_add_rows(z2, unit(0.6, 'cm'), 2)

          z2 <- gtable_add_grob(z2,
          list(rectGrob(gp = gpar(col = NA, fill = gray(0.7))),
          textGrob("2001", gp = gpar(col = "black",cex=0.9))),
          t=2, l=4, b=3, r=13, name = paste(runif(2)))

          z3 <- ggplotGrob(p3)
          z3 <- gtable_add_rows(z3, unit(0.6, 'cm'), 2)

          z3 <- gtable_add_grob(z3,
          list(rectGrob(gp = gpar(col = NA, fill = gray(0.7))),
          textGrob("2002", gp = gpar(col = "black",cex=0.9))),
          t=2, l=4, b=3, r=13, name = paste(runif(2)))


          finally, plotting



          plot_grid(z1, z2, z3, nrow = 3)


          enter image description here



          You can also have the years indicated in the column like in facet_grid instead of row. In that case, you have to add a column by using gtable_add_cols. But make sure to (a) add the column at the correct position in step-2, and (b) get the correct values for t, l, b and r in step-3.






          share|improve this answer

























          • plot_grid seems to be deprecated, is there an updated alternative to this?

            – EuGENE
            Mar 20 at 16:58













          3












          3








          3







          I am not sure you can do this by just using facet_wrap, so probably your attempt is the way to go. But IMO it needs an improvement. Presently, you are missing actual y-lab (sales) and it kinda misguides what is plotted in y- axis



          You could improve what you are doing by adding another plot title row by using gtable and grid.



          p1 <- ggplot(dt[dt$year == 2000,], aes(median, sales)) +
          geom_point() +
          facet_wrap("month", scales = "free") +
          theme(axis.title.x = element_blank())

          p2 <- ggplot(dt[dt$year == 2001,], aes(median, sales)) +
          geom_point() +
          facet_wrap("month", scales = "free") +
          theme(axis.title.x = element_blank())

          p3 <- ggplot(dt[dt$year == 2002,], aes(median, sales)) +
          geom_point() +
          facet_wrap("month", scales = "free")


          Note that the labs are removed from the above plots.



          if ( !require(grid) ) install.packages("grid"); library(grid) 
          if ( !require(gtable ) ) install.packages("gtable"); library(gtable)

          z1 <- ggplotGrob(p1) # Generate a ggplot2 plot grob
          z1 <- gtable_add_rows(z1, unit(0.6, 'cm'), 2) # add new rows in specified position

          z1 <- gtable_add_grob(z1,
          list(rectGrob(gp = gpar(col = NA, fill = gray(0.7))),
          textGrob("2000", gp = gpar(col = "black",cex=0.9))),
          t=2, l=4, b=3, r=13, name = paste(runif(2))) #add grobs into the table


          Note that in step 3, getting the exact values for t (top extent), l(left extent), b (bottom extent) and r(right extent) might need trial and error method



          Now repeat the above steps for p2 and p3



          z2 <- ggplotGrob(p2)
          z2 <- gtable_add_rows(z2, unit(0.6, 'cm'), 2)

          z2 <- gtable_add_grob(z2,
          list(rectGrob(gp = gpar(col = NA, fill = gray(0.7))),
          textGrob("2001", gp = gpar(col = "black",cex=0.9))),
          t=2, l=4, b=3, r=13, name = paste(runif(2)))

          z3 <- ggplotGrob(p3)
          z3 <- gtable_add_rows(z3, unit(0.6, 'cm'), 2)

          z3 <- gtable_add_grob(z3,
          list(rectGrob(gp = gpar(col = NA, fill = gray(0.7))),
          textGrob("2002", gp = gpar(col = "black",cex=0.9))),
          t=2, l=4, b=3, r=13, name = paste(runif(2)))


          finally, plotting



          plot_grid(z1, z2, z3, nrow = 3)


          enter image description here



          You can also have the years indicated in the column like in facet_grid instead of row. In that case, you have to add a column by using gtable_add_cols. But make sure to (a) add the column at the correct position in step-2, and (b) get the correct values for t, l, b and r in step-3.






          share|improve this answer















          I am not sure you can do this by just using facet_wrap, so probably your attempt is the way to go. But IMO it needs an improvement. Presently, you are missing actual y-lab (sales) and it kinda misguides what is plotted in y- axis



          You could improve what you are doing by adding another plot title row by using gtable and grid.



          p1 <- ggplot(dt[dt$year == 2000,], aes(median, sales)) +
          geom_point() +
          facet_wrap("month", scales = "free") +
          theme(axis.title.x = element_blank())

          p2 <- ggplot(dt[dt$year == 2001,], aes(median, sales)) +
          geom_point() +
          facet_wrap("month", scales = "free") +
          theme(axis.title.x = element_blank())

          p3 <- ggplot(dt[dt$year == 2002,], aes(median, sales)) +
          geom_point() +
          facet_wrap("month", scales = "free")


          Note that the labs are removed from the above plots.



          if ( !require(grid) ) install.packages("grid"); library(grid) 
          if ( !require(gtable ) ) install.packages("gtable"); library(gtable)

          z1 <- ggplotGrob(p1) # Generate a ggplot2 plot grob
          z1 <- gtable_add_rows(z1, unit(0.6, 'cm'), 2) # add new rows in specified position

          z1 <- gtable_add_grob(z1,
          list(rectGrob(gp = gpar(col = NA, fill = gray(0.7))),
          textGrob("2000", gp = gpar(col = "black",cex=0.9))),
          t=2, l=4, b=3, r=13, name = paste(runif(2))) #add grobs into the table


          Note that in step 3, getting the exact values for t (top extent), l(left extent), b (bottom extent) and r(right extent) might need trial and error method



          Now repeat the above steps for p2 and p3



          z2 <- ggplotGrob(p2)
          z2 <- gtable_add_rows(z2, unit(0.6, 'cm'), 2)

          z2 <- gtable_add_grob(z2,
          list(rectGrob(gp = gpar(col = NA, fill = gray(0.7))),
          textGrob("2001", gp = gpar(col = "black",cex=0.9))),
          t=2, l=4, b=3, r=13, name = paste(runif(2)))

          z3 <- ggplotGrob(p3)
          z3 <- gtable_add_rows(z3, unit(0.6, 'cm'), 2)

          z3 <- gtable_add_grob(z3,
          list(rectGrob(gp = gpar(col = NA, fill = gray(0.7))),
          textGrob("2002", gp = gpar(col = "black",cex=0.9))),
          t=2, l=4, b=3, r=13, name = paste(runif(2)))


          finally, plotting



          plot_grid(z1, z2, z3, nrow = 3)


          enter image description here



          You can also have the years indicated in the column like in facet_grid instead of row. In that case, you have to add a column by using gtable_add_cols. But make sure to (a) add the column at the correct position in step-2, and (b) get the correct values for t, l, b and r in step-3.







          share|improve this answer














          share|improve this answer



          share|improve this answer








          edited Oct 8 '18 at 23:20

























          answered Oct 8 '18 at 19:27









          MaMuMaMu

          509418




          509418












          • plot_grid seems to be deprecated, is there an updated alternative to this?

            – EuGENE
            Mar 20 at 16:58

















          • plot_grid seems to be deprecated, is there an updated alternative to this?

            – EuGENE
            Mar 20 at 16:58
















          plot_grid seems to be deprecated, is there an updated alternative to this?

          – EuGENE
          Mar 20 at 16:58





          plot_grid seems to be deprecated, is there an updated alternative to this?

          – EuGENE
          Mar 20 at 16:58

















          draft saved

          draft discarded
















































          Thanks for contributing an answer to Stack Overflow!


          • Please be sure to answer the question. Provide details and share your research!

          But avoid


          • Asking for help, clarification, or responding to other answers.

          • Making statements based on opinion; back them up with references or personal experience.

          To learn more, see our tips on writing great answers.




          draft saved


          draft discarded














          StackExchange.ready(
          function ()
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f52706599%2fhow-to-position-strip-labels-in-facet-wrap-like-in-facet-grid%23new-answer', 'question_page');

          );

          Post as a guest















          Required, but never shown





















































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown

































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown







          Popular posts from this blog

          1928 у кіно

          Ель Греко

          Захаров Федір Захарович