如何在ggplot2中将百分比四舍五入到两位小数

9

我的代码生成了这个图表:

enter image description here

代码:

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()

我已经找到了代码,可以使数据标签正确地放置在每个条形图的上方或下方,但是似乎无法将值四舍五入到小数点后两位。
我尝试过使用round(areas, 2)sprintf("%0.2f")等方法,但是无论我尝试什么都不起作用,我确信我错过了一些简单的东西。
我做错了什么?
更新:
在Roland的“鼓励”下,我现在几乎解决了这个问题;现在的问题是我现在失去了百分号:

enter image description here

我如何把它们找回来?

更新后的代码:

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()

paste0(round(差异值, 4) * 100, "%") - bouncyball
你在那里定义标签:geom_text(aes(label = paste(Difference * 100, "%")。那里没有任何四舍五入。 - Roland
@Roland 我该如何将数值四舍五入到小数点后两位? - Mus
你知道的,你只是在错误的地方做了。 - Roland
@Roland,我看到你很难搞!我现在已经弄清楚了,但是百分号符号现在消失了 - 你能帮忙吗? - Mus
4
sprintf("%0.2f %%", Difference * 100)。如果您不想在ggplot2中出现意外行为,请跳过areas$ - Roland
4个回答

7

最近版本的ggplot2/scales包提供了一些参数给scales::percent函数,例如将百分比四舍五入为整数:

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

这大致相当于round(x, 0L):注意是1而不是0
或者对于两位小数:
scale_y_continuous(labels = scales::percent_format(accuracy = 3L))

这里有一个相关问题,请查看Henrik在这里的答案: 如何防止scales::percent添加十进制


5

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


1
可以这样写。为了完整起见,我可能会给参数命名以确保安全。例如:percent(Difference, accuracy = .11) - tjebo

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

你可以使用paste0而不是paste(sep="") - tjebo

0
我在geom_text中使用formattablepercent函数。 所以在你的情况下,我会这样做:
geom_text(aes(label = formattable::percent(Difference)),
          vjust = ifelse(Difference >= 0, -1.5, 1.5))

你可以在百分比中定义digits,但默认值为2,这正是你所需要的。%符号保留,就像你所期望的那样。此外,你可以对它进行操作,因为它仍然是numeric而不是像其他解决方案一样character


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接