如何在条形图中将Y轴数字转换为百分比?

162

如何像图片中那样将y轴变成百分比形式?我可以改变y轴范围,但无法将其转换为百分比。

enter image description here
4个回答

346

使用:

+ scale_y_continuous(labels = scales::percent)

或者,为百分比指定格式参数:

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

(labels = percent 命令自ggplot2版本2.2.1起已过时)


6
我喜欢你不需要键入 library(scales) - Akshay Gaur
scales::percent(accuracy = 1)无法工作的原因是*_format()版本创建了一个函数,而不是percent()单独创建的内容,这是正确的吗? - MokeEire

102

原则上,您可以将任何重新格式化函数传递给labels参数:

+ scale_y_continuous(labels = function(x) paste0(x*100, "%")) # Multiply by 100 & add %  

或者

+ scale_y_continuous(labels = function(x) paste0(x, "%")) # Add percent sign 

可重现的例子:


library(ggplot2)
df = data.frame(x=seq(0,1,0.1), y=seq(0,1,0.1))

ggplot(df, aes(x,y)) + 
  geom_point() +
  scale_y_continuous(labels = function(x) paste0(x*100, "%"))

13
+1 表示不依赖外部程序库。我知道 Hadley 同时是 ggplot2 和 scales 的作者,所以这并不重要—但仍然感谢提供这个解决方案。 - Mark White

52

ggplot2scales包可以实现这一点:

y <- c(12, 20)/100
x <- c(1, 2)

library(ggplot2)
library(scales)
myplot <- qplot(as.factor(x), y, geom="bar")
myplot + scale_y_continuous(labels=percent)
似乎 stat() 选项已被移除,导致出现错误信息。尝试这样做:
library(scales)

myplot <- ggplot(mtcars, aes(factor(cyl))) + 
          geom_bar(aes(y = (..count..)/sum(..count..))) + 
          scale_y_continuous(labels=percent)

myplot

6

以上来自 @Deena 的函数修改方法,可以让标签更加灵活多变。例如,我的ggplot中有一个计数变量的分母是140,我就可以使用她的示例进行修改:

scale_y_continuous(labels = function(x) paste0(round(x/140*100,1), "%"), breaks = seq(0, 140, 35))

这使我得以将百分比计算在140的分母上,并以25%的增量来打破刻度,而不是默认的奇怪数字。关键在于刻度仍然由原始计数设置,而不是由你的百分比设置。因此,这些断点必须从零到分母值,"breaks"中的第三个参数必须是分母除以您想要的标签断点数量(例如,140 * 0.25 = 35)。

如果我要重复使用这个图表多次,但每次分母都会变化,我该如何修改上述代码,以免每次都手动查找分母? - missanita

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