我正在制作一系列条形图,其中百分比值位于每个条形图上方。我想把它舍入到0位小数,但默认为小数点后1位。这是一个使用mtcars的例子。
library(ggplot2)
library(scales)
d <- mtcars
g <- ggplot(d, aes(gear)) +
geom_bar(aes(y = (..count..)/sum(..count..), fill=factor(..x..)), stat= "count")+
geom_text(aes(label = scales::percent((..count..)/sum(..count..)),
y= ((..count..)/sum(..count..))), stat="count",
vjust = -.25)
有没有办法将它们舍入到最接近的整数,这样条形标记为47%,38%和16%?
解决方法可能包括手动注释标签或生成汇总data.frame,从中拉出标签。但是,由于我生成了大量的表,我更倾向于在单个ggplot命令中包含我的所有代码。
答案 0 :(得分:7)
这是对您当前代码的最小更改,它将执行您想要的操作:
library(ggplot2)
library(scales)
d <- mtcars
g <- ggplot(d, aes(gear)) +
geom_bar(aes(y = (..count..)/sum(..count..), fill=factor(..x..)), stat= "count")+
geom_text(aes(label = scales::percent(round((..count..)/sum(..count..),2)),
y= ((..count..)/sum(..count..))), stat="count",
vjust = -.25)
我已在您的部门中添加了对round(...,2)
的调用,该调用将对比率进行四舍五入,然后再将其传递给percent
。
就个人而言,我会在ggplot之外执行此操作以获得清晰的代码。
library(ggplot2)
library(scales)
library(dplyr)
d <- mtcars %>%
group_by(gear) %>%
summarise(Count = n()) %>%
mutate( gear = factor(gear),
Ratio = Count / sum(Count),
label = percent(Ratio %>% round(2)))
g <- ggplot(d, aes(x=gear,y=Ratio,label=label,fill=gear)) +
geom_bar(stat='identity') +
geom_text(vjust=0)
g
当我必须在6个月内回过头来看看它时,弄清楚我做了什么会更容易。
答案 1 :(得分:1)
我处理了相同的问题,并通过在accuracy = 1L
中添加scales::percent()
来解决了这个问题,并且效果很好:
label = scales::percent(round((..count..)/tapply(..count..,..PANEL..,sum)[..PANEL..],
2),
accuracy = 1L))