在分类variables的图表中显示%而不是计数

我正在绘制一个分类variables,而不是显示每个类别值的计数。

我正在寻找一种方法来让ggplot显示该类别中的值的百分比。 当然,有可能用计算出来的百分比来创build另一个variables,然后绘制一个variables,但是我必须做几十次,我希望能够通过一个命令来实现。

我正在试验类似的东西

 qplot(mydataf) + stat_bin(aes(n = nrow(mydataf), y = ..count../n)) + scale_y_continuous(formatter = "percent") 

但我必须错误地使用它,因为我有错误。

为了便于重现设置,下面是一个简化的例子:

 mydata <- c ("aa", "bb", null, "bb", "cc", "aa", "aa", "aa", "ee", null, "cc"); mydataf <- factor(mydata); qplot (mydataf); #this shows the count, I'm looking to see % displayed. 

在真实情况下,我可能会使用ggplot而不是qplot ,但正确的方式来使用stat_bin仍然没有我。

我也尝试了这四种方法:

 ggplot(mydataf, aes(y = (..count..)/sum(..count..))) + scale_y_continuous(formatter = 'percent'); ggplot(mydataf, aes(y = (..count..)/sum(..count..))) + scale_y_continuous(formatter = 'percent') + geom_bar(); ggplot(mydataf, aes(x = levels(mydataf), y = (..count..)/sum(..count..))) + scale_y_continuous(formatter = 'percent'); ggplot(mydataf, aes(x = levels(mydataf), y = (..count..)/sum(..count..))) + scale_y_continuous(formatter = 'percent') + geom_bar(); 

但所有4给:

 Error: ggplot2 doesn't know how to deal with data of class factor 

同样的错误出现简单的情况下

 ggplot (data=mydataf, aes(levels(mydataf))) + geom_bar() 

所以这显然是ggplot如何与单个向量交互的东西。 我正在抓我的头,search错误给出了一个单一的结果 。

由于这个答案已经有了一些有意义的变化ggplot语法。 总结以上评论中的讨论:

  require(ggplot2) require(scales) p <- ggplot(mydataf, aes(x = foo)) + geom_bar(aes(y = (..count..)/sum(..count..))) + ## version 3.0.9 # scale_y_continuous(labels = percent_format()) ## version 3.1.0 scale_y_continuous(labels=percent) 

这是一个使用mtcars的可重复的例子:

  ggplot(mtcars, aes(x = factor(hp))) + geom_bar(aes(y = (..count..)/sum(..count..))) + ## scale_y_continuous(labels = percent_format()) #version 3.0.9 scale_y_continuous(labels = percent) #version 3.1.0 

在这里输入图像说明

这个问题目前是谷歌在“ggplot计数vs百分比直方图”上排名第一的,所以希望这有助于提炼当前收集到的答案中的所有信息。

备注:如果hp未设置为因子,则ggplot返回:

在这里输入图像说明

这个修改的代码应该可以工

 p = ggplot(mydataf, aes(x = foo)) + geom_bar(aes(y = (..count..)/sum(..count..))) + scale_y_continuous(formatter = 'percent') 

如果你的数据有NAs并且你不想让它们包含在图中,把na.omit(mydataf)作为参数传给ggplot。

希望这可以帮助。

与ggplot2版本2.1.0是

 + scale_y_continuous(labels = scales::percent) 

如果你想在Y轴上的百分比和条上标记:

 library(ggplot2) library(scales) ggplot(mtcars, aes(x = as.factor(am))) + geom_bar(aes(y = (..count..)/sum(..count..))) + geom_text(aes(y = ((..count..)/sum(..count..)), label = scales::percent((..count..)/sum(..count..))), stat = "count", vjust = -0.25) + scale_y_continuous(labels = percent) + labs(title = "Manual vs. Automatic Frequency", y = "Percent", x = "Automatic Transmission") 

在这里输入图像说明

添加条形标签时,您可能希望省略清洁图表的y轴,方法是在末尾添加:

  theme( axis.text.y=element_blank(), axis.ticks=element_blank(), axis.title.y=element_blank() ) 

在这里输入图像说明

截至2017年3月,使用ggplot2 2.2.1我认为最好的解决scheme在Hadley Wickham的R for data science book中解释:

 ggplot(mydataf) + stat_count(mapping = aes(x=foo, y=..prop.., group=1)) 

stat_count计算两个variables: count是默认使用的,但是您可以select使用显示比例的prop

如果您想在y轴上使用百分比标签,但使用实际的Ns,请尝试以下操作:

  library(scales) perbar=function(xx){ q=ggplot(data=data.frame(xx),aes(x=xx))+ geom_bar(aes(y = (..count..)),fill="orange") q=q+ geom_text(aes(y = (..count..),label = scales::percent((..count..)/sum(..count..))), stat="bin",colour="darkgreen") q } perbar(mtcars$disp) 

这是一个对facteted数据的解决方法。 (@Andrew接受的答案在这种情况下不起作用。)这个想法是使用dplyr来计算百分比值,然后使用geom_col来创build该图。

 library(ggplot2) library(scales) library(magrittr) library(dplyr) binwidth <- 30 mtcars.stats <- mtcars %>% group_by(cyl) %>% mutate(bin = cut(hp, breaks=seq(0,400, binwidth), labels= seq(0+binwidth,400, binwidth)-(binwidth/2)), n = n()) %>% group_by(cyl, bin) %>% summarise(p = n()/n[1]) %>% ungroup() %>% mutate(bin = as.numeric(as.character(bin))) ggplot(mtcars.stats, aes(x = bin, y= p)) + geom_col() + scale_y_continuous(labels = percent) + facet_grid(cyl~.) 

这是情节:

在这里输入图像说明