How to round percentage to 2 decimal places in ggplot2
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=""))
Related videos on Youtube
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, 2022Comments
-
Mus over 1 year
My code produces this graph:
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)
andsprintf("%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:
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 over 6 years
sprintf("%0.2f %%", Difference * 100)
. Skip theareas$
if you don't want surprising behavior from ggplot2.
-
-
tjebo almost 4 yearsinstead of paste(sep=""), you could also use just
paste0
-
tjebo almost 4 yearsThat works. For completeness, I'd probably name the argument just to be safe. i.e.,
percent(Difference, accuracy = .11)