How to round percentage to 2 decimal places in ggplot2

12,817

Solution 1

Recent versions of ggplot2/scales packages offer arguments to the scales::percent function, for instance to round percentages to integers:

scale_y_continuous(labels = scales::percent_format(accuracy = 1L))

This is roughly equivalent to round(x, 0L): Note the 1 instead of 0.

Or for two digits:

scale_y_continuous(labels = scales::percent_format(accuracy = 3L))

There is a near-duplicate question. Check Henrik's answer here: How to prevent scales::percent from adding decimal

Solution 2

geom_text(label=percent(Difference,.11))

Solution 3

aes(label=paste(round(Difference*100,digits= 2),"%",sep=""))
Share:
12,817

Related videos on Youtube

Mus
Author by

Mus

“Data Scientist (n.): Person who is better at statistics than any software engineer and better at software engineering than any statistician.” ― Josh Wills, Director of Data Engineering at Slack

Updated on September 15, 2022

Comments

  • Mus
    Mus over 1 year

    My code produces this graph:

    enter image description here

    Code:

    ggplot(areas, aes(x = RETAILER, y = Difference), label=sprintf("%0.2f", round(areas$Difference, digits = 2))) +
    geom_bar(stat = "identity", aes(fill = RETAILER), colour = "black") +
    scale_y_continuous("Percentage", labels = percent_format()) +
    geom_text(aes(label = paste(Difference * 100, "%"),
                  vjust = ifelse(Difference >= 0, -1.5, 1.5))) +
    theme_classic()
    

    I have found code to allow the data labels to be positioned correctly above or below each bar, but I cannot seem to get the values to round to 2 decimal places.

    I have tried round(areas, 2) and sprintf("%0.2f") among other things, but nothing I try seems to work and I'm sure that I'm missing something simple.

    Where am I going wrong?

    UPDATE:

    With Roland's "encouragement", I have now managed to almost resolve this; the problem now is that I have now lost the percentage signs:

    enter image description here

    How do I get them back?

    Updated code:

    ggplot(areas, aes(x = RETAILER, y = Difference)) +
      geom_bar(stat = "identity", aes(fill = RETAILER), colour = "black") +
      scale_y_continuous("Percentage", labels = percent_format()) +
      geom_text(aes(label = sprintf("%0.2f", areas$Difference * 100, "%"),
                    vjust = ifelse(Difference >= 0, -1.5, 1.5))) +
      theme_classic()
    
    • Roland
      Roland over 6 years
      sprintf("%0.2f %%", Difference * 100). Skip the areas$ if you don't want surprising behavior from ggplot2.
  • tjebo
    tjebo almost 4 years
    instead of paste(sep=""), you could also use just paste0
  • tjebo
    tjebo almost 4 years
    That works. For completeness, I'd probably name the argument just to be safe. i.e., percent(Difference, accuracy = .11)