Multi-line legend text including exponent with ggplot

The name of the pictureThe name of the pictureThe name of the pictureClash Royale CLAN TAG#URR8PPP











up vote
6
down vote

favorite
2












With ggplot, I want to add a left aligned legend title with multiple lines and exponents in the text for the units of the values in the legend. I'm plotting data of a form similar to:



leakage_rates_levels <- c(5.4, 0.25)
leakage_rates <- as.factor(rep(leakage_rates_levels, 3)) # L/s-m^2 at 75 Pa
data_groups_levels <- c('Set 1', 'Set 2', 'Set 3')
data_groups <- as.factor(rep(data_groups_levels, each=2))
moisture_level <- c(7, 3, 11, 10, 16, 6)
plotdt <- data.frame(data_groups, leakage_rates, moisture_level)


I use expression() to add exponents to the units in the legend. The following code generates the desired figure, but with the legend title text mis-formatted.



ggplot(plotdt, aes(data_groups)) +
geom_bar(aes(weight=moisture_level, fill=leakage_rates), position='dodge') +
labs(y='Moisture Level') +
labs(fill=expression(paste('Leakage Ratenat 75 Pan(L/s-', m^2, ')', sep=''))) +
theme(panel.grid.major.x = element_blank(),
axis.title.x = element_blank())


The legend title appears left aligned except for the final line, which has a bunch of extraneous spaces in the middle of it.



Three line legend text where the third line indicates the units, liters per second meter squared, but the meter squared term is pushed to the right margin while all the other text is left aligned, leaving a large white space in the middle of the third line.



Using legend_title_align=0 (suggested here) and/or legend_title=element_text(hjust=1) in theme() have no effect. Trying to add phantom() spacing also did not work (suggested here). The end of the top answer to this question notes the same problem I'm encountering but does not propose a solution.



Is there a way to get the meter squared term in the legend to be left-aligned like the rest of the text?



I am using ggplot 3.1.0 and R 3.5.1.










share|improve this question

























    up vote
    6
    down vote

    favorite
    2












    With ggplot, I want to add a left aligned legend title with multiple lines and exponents in the text for the units of the values in the legend. I'm plotting data of a form similar to:



    leakage_rates_levels <- c(5.4, 0.25)
    leakage_rates <- as.factor(rep(leakage_rates_levels, 3)) # L/s-m^2 at 75 Pa
    data_groups_levels <- c('Set 1', 'Set 2', 'Set 3')
    data_groups <- as.factor(rep(data_groups_levels, each=2))
    moisture_level <- c(7, 3, 11, 10, 16, 6)
    plotdt <- data.frame(data_groups, leakage_rates, moisture_level)


    I use expression() to add exponents to the units in the legend. The following code generates the desired figure, but with the legend title text mis-formatted.



    ggplot(plotdt, aes(data_groups)) +
    geom_bar(aes(weight=moisture_level, fill=leakage_rates), position='dodge') +
    labs(y='Moisture Level') +
    labs(fill=expression(paste('Leakage Ratenat 75 Pan(L/s-', m^2, ')', sep=''))) +
    theme(panel.grid.major.x = element_blank(),
    axis.title.x = element_blank())


    The legend title appears left aligned except for the final line, which has a bunch of extraneous spaces in the middle of it.



    Three line legend text where the third line indicates the units, liters per second meter squared, but the meter squared term is pushed to the right margin while all the other text is left aligned, leaving a large white space in the middle of the third line.



    Using legend_title_align=0 (suggested here) and/or legend_title=element_text(hjust=1) in theme() have no effect. Trying to add phantom() spacing also did not work (suggested here). The end of the top answer to this question notes the same problem I'm encountering but does not propose a solution.



    Is there a way to get the meter squared term in the legend to be left-aligned like the rest of the text?



    I am using ggplot 3.1.0 and R 3.5.1.










    share|improve this question























      up vote
      6
      down vote

      favorite
      2









      up vote
      6
      down vote

      favorite
      2






      2





      With ggplot, I want to add a left aligned legend title with multiple lines and exponents in the text for the units of the values in the legend. I'm plotting data of a form similar to:



      leakage_rates_levels <- c(5.4, 0.25)
      leakage_rates <- as.factor(rep(leakage_rates_levels, 3)) # L/s-m^2 at 75 Pa
      data_groups_levels <- c('Set 1', 'Set 2', 'Set 3')
      data_groups <- as.factor(rep(data_groups_levels, each=2))
      moisture_level <- c(7, 3, 11, 10, 16, 6)
      plotdt <- data.frame(data_groups, leakage_rates, moisture_level)


      I use expression() to add exponents to the units in the legend. The following code generates the desired figure, but with the legend title text mis-formatted.



      ggplot(plotdt, aes(data_groups)) +
      geom_bar(aes(weight=moisture_level, fill=leakage_rates), position='dodge') +
      labs(y='Moisture Level') +
      labs(fill=expression(paste('Leakage Ratenat 75 Pan(L/s-', m^2, ')', sep=''))) +
      theme(panel.grid.major.x = element_blank(),
      axis.title.x = element_blank())


      The legend title appears left aligned except for the final line, which has a bunch of extraneous spaces in the middle of it.



      Three line legend text where the third line indicates the units, liters per second meter squared, but the meter squared term is pushed to the right margin while all the other text is left aligned, leaving a large white space in the middle of the third line.



      Using legend_title_align=0 (suggested here) and/or legend_title=element_text(hjust=1) in theme() have no effect. Trying to add phantom() spacing also did not work (suggested here). The end of the top answer to this question notes the same problem I'm encountering but does not propose a solution.



      Is there a way to get the meter squared term in the legend to be left-aligned like the rest of the text?



      I am using ggplot 3.1.0 and R 3.5.1.










      share|improve this question













      With ggplot, I want to add a left aligned legend title with multiple lines and exponents in the text for the units of the values in the legend. I'm plotting data of a form similar to:



      leakage_rates_levels <- c(5.4, 0.25)
      leakage_rates <- as.factor(rep(leakage_rates_levels, 3)) # L/s-m^2 at 75 Pa
      data_groups_levels <- c('Set 1', 'Set 2', 'Set 3')
      data_groups <- as.factor(rep(data_groups_levels, each=2))
      moisture_level <- c(7, 3, 11, 10, 16, 6)
      plotdt <- data.frame(data_groups, leakage_rates, moisture_level)


      I use expression() to add exponents to the units in the legend. The following code generates the desired figure, but with the legend title text mis-formatted.



      ggplot(plotdt, aes(data_groups)) +
      geom_bar(aes(weight=moisture_level, fill=leakage_rates), position='dodge') +
      labs(y='Moisture Level') +
      labs(fill=expression(paste('Leakage Ratenat 75 Pan(L/s-', m^2, ')', sep=''))) +
      theme(panel.grid.major.x = element_blank(),
      axis.title.x = element_blank())


      The legend title appears left aligned except for the final line, which has a bunch of extraneous spaces in the middle of it.



      Three line legend text where the third line indicates the units, liters per second meter squared, but the meter squared term is pushed to the right margin while all the other text is left aligned, leaving a large white space in the middle of the third line.



      Using legend_title_align=0 (suggested here) and/or legend_title=element_text(hjust=1) in theme() have no effect. Trying to add phantom() spacing also did not work (suggested here). The end of the top answer to this question notes the same problem I'm encountering but does not propose a solution.



      Is there a way to get the meter squared term in the legend to be left-aligned like the rest of the text?



      I am using ggplot 3.1.0 and R 3.5.1.







      r ggplot2






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked Nov 18 at 19:30









      trynthink

      101210




      101210






















          2 Answers
          2






          active

          oldest

          votes

















          up vote
          4
          down vote



          accepted










          You can use the unicode representation of superscript two (U+00B2) and avoid the
          problem-causing combination of expression() and a multi-line legend title:



          ggplot(plotdt, aes(data_groups)) +
          geom_bar(aes(weight=moisture_level, fill=leakage_rates), position='dodge') +
          labs(y='Moisture Level') +
          labs(fill=paste('Leakage Ratenat 75 Pan(L/s-mu00b2)', sep='')) +
          theme(panel.grid.major.x = element_blank(),
          axis.title.x = element_blank())


          Plot using Superscript






          share|improve this answer



























            up vote
            1
            down vote













            You can use atop to have lines "atop" each other.



            Because you have 3 lines and atop only accepts 2 arguments however, you need to have 2 atop nested in one another. This makes the font on some of the lines smaller. The way to prevent this is to pass the expressions to either textstyle or displaystyle:



            ggplot(plotdt, aes(data_groups)) +
            geom_bar(aes(weight = moisture_level, fill = leakage_rates), position = "dodge") +
            labs(y = "Moisture Level") +
            labs(fill = expression(atop(atop(textstyle("Leakage Rate"),
            textstyle("at 75 Pa")),
            "(L/s-" ~m^2~ ")"))) +
            theme(panel.grid.major.x = element_blank(), axis.title.x = element_blank())


            enter image description here






            share|improve this answer






















              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',
              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%2f53364672%2fmulti-line-legend-text-including-exponent-with-ggplot%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








              up vote
              4
              down vote



              accepted










              You can use the unicode representation of superscript two (U+00B2) and avoid the
              problem-causing combination of expression() and a multi-line legend title:



              ggplot(plotdt, aes(data_groups)) +
              geom_bar(aes(weight=moisture_level, fill=leakage_rates), position='dodge') +
              labs(y='Moisture Level') +
              labs(fill=paste('Leakage Ratenat 75 Pan(L/s-mu00b2)', sep='')) +
              theme(panel.grid.major.x = element_blank(),
              axis.title.x = element_blank())


              Plot using Superscript






              share|improve this answer
























                up vote
                4
                down vote



                accepted










                You can use the unicode representation of superscript two (U+00B2) and avoid the
                problem-causing combination of expression() and a multi-line legend title:



                ggplot(plotdt, aes(data_groups)) +
                geom_bar(aes(weight=moisture_level, fill=leakage_rates), position='dodge') +
                labs(y='Moisture Level') +
                labs(fill=paste('Leakage Ratenat 75 Pan(L/s-mu00b2)', sep='')) +
                theme(panel.grid.major.x = element_blank(),
                axis.title.x = element_blank())


                Plot using Superscript






                share|improve this answer






















                  up vote
                  4
                  down vote



                  accepted







                  up vote
                  4
                  down vote



                  accepted






                  You can use the unicode representation of superscript two (U+00B2) and avoid the
                  problem-causing combination of expression() and a multi-line legend title:



                  ggplot(plotdt, aes(data_groups)) +
                  geom_bar(aes(weight=moisture_level, fill=leakage_rates), position='dodge') +
                  labs(y='Moisture Level') +
                  labs(fill=paste('Leakage Ratenat 75 Pan(L/s-mu00b2)', sep='')) +
                  theme(panel.grid.major.x = element_blank(),
                  axis.title.x = element_blank())


                  Plot using Superscript






                  share|improve this answer












                  You can use the unicode representation of superscript two (U+00B2) and avoid the
                  problem-causing combination of expression() and a multi-line legend title:



                  ggplot(plotdt, aes(data_groups)) +
                  geom_bar(aes(weight=moisture_level, fill=leakage_rates), position='dodge') +
                  labs(y='Moisture Level') +
                  labs(fill=paste('Leakage Ratenat 75 Pan(L/s-mu00b2)', sep='')) +
                  theme(panel.grid.major.x = element_blank(),
                  axis.title.x = element_blank())


                  Plot using Superscript







                  share|improve this answer












                  share|improve this answer



                  share|improve this answer










                  answered Nov 18 at 20:33









                  Mr. Zen

                  419214




                  419214






















                      up vote
                      1
                      down vote













                      You can use atop to have lines "atop" each other.



                      Because you have 3 lines and atop only accepts 2 arguments however, you need to have 2 atop nested in one another. This makes the font on some of the lines smaller. The way to prevent this is to pass the expressions to either textstyle or displaystyle:



                      ggplot(plotdt, aes(data_groups)) +
                      geom_bar(aes(weight = moisture_level, fill = leakage_rates), position = "dodge") +
                      labs(y = "Moisture Level") +
                      labs(fill = expression(atop(atop(textstyle("Leakage Rate"),
                      textstyle("at 75 Pa")),
                      "(L/s-" ~m^2~ ")"))) +
                      theme(panel.grid.major.x = element_blank(), axis.title.x = element_blank())


                      enter image description here






                      share|improve this answer


























                        up vote
                        1
                        down vote













                        You can use atop to have lines "atop" each other.



                        Because you have 3 lines and atop only accepts 2 arguments however, you need to have 2 atop nested in one another. This makes the font on some of the lines smaller. The way to prevent this is to pass the expressions to either textstyle or displaystyle:



                        ggplot(plotdt, aes(data_groups)) +
                        geom_bar(aes(weight = moisture_level, fill = leakage_rates), position = "dodge") +
                        labs(y = "Moisture Level") +
                        labs(fill = expression(atop(atop(textstyle("Leakage Rate"),
                        textstyle("at 75 Pa")),
                        "(L/s-" ~m^2~ ")"))) +
                        theme(panel.grid.major.x = element_blank(), axis.title.x = element_blank())


                        enter image description here






                        share|improve this answer
























                          up vote
                          1
                          down vote










                          up vote
                          1
                          down vote









                          You can use atop to have lines "atop" each other.



                          Because you have 3 lines and atop only accepts 2 arguments however, you need to have 2 atop nested in one another. This makes the font on some of the lines smaller. The way to prevent this is to pass the expressions to either textstyle or displaystyle:



                          ggplot(plotdt, aes(data_groups)) +
                          geom_bar(aes(weight = moisture_level, fill = leakage_rates), position = "dodge") +
                          labs(y = "Moisture Level") +
                          labs(fill = expression(atop(atop(textstyle("Leakage Rate"),
                          textstyle("at 75 Pa")),
                          "(L/s-" ~m^2~ ")"))) +
                          theme(panel.grid.major.x = element_blank(), axis.title.x = element_blank())


                          enter image description here






                          share|improve this answer














                          You can use atop to have lines "atop" each other.



                          Because you have 3 lines and atop only accepts 2 arguments however, you need to have 2 atop nested in one another. This makes the font on some of the lines smaller. The way to prevent this is to pass the expressions to either textstyle or displaystyle:



                          ggplot(plotdt, aes(data_groups)) +
                          geom_bar(aes(weight = moisture_level, fill = leakage_rates), position = "dodge") +
                          labs(y = "Moisture Level") +
                          labs(fill = expression(atop(atop(textstyle("Leakage Rate"),
                          textstyle("at 75 Pa")),
                          "(L/s-" ~m^2~ ")"))) +
                          theme(panel.grid.major.x = element_blank(), axis.title.x = element_blank())


                          enter image description here







                          share|improve this answer














                          share|improve this answer



                          share|improve this answer








                          edited Nov 19 at 1:45

























                          answered Nov 18 at 21:44









                          prosoitos

                          814219




                          814219



























                               

                              draft saved


                              draft discarded















































                               


                              draft saved


                              draft discarded














                              StackExchange.ready(
                              function ()
                              StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53364672%2fmulti-line-legend-text-including-exponent-with-ggplot%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

                              How to check contact read email or not when send email to Individual?

                              Displaying single band from multi-band raster using QGIS

                              How many registers does an x86_64 CPU actually have?