Reputation: 7540
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)
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:
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()
Upvotes: 9
Views: 18413
Reputation: 833
aes(label=paste(round(Difference*100,digits= 2),"%",sep=""))
Upvotes: 2
Reputation: 10530
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
Upvotes: 7
Reputation: 371
I use the percent
function from formattable
within geom_text
.
So in your case I would do like so:
geom_text(aes(label = formattable::percent(Difference)),
vjust = ifelse(Difference >= 0, -1.5, 1.5))
you can define digits
within percent
, but the default is 2, which is what you're looking for. The % symbols remains, like you desire. Plus, you can do stuff with it as it is still numeric
underneath and not character
like other solutions out there.
Upvotes: 0