在分类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~.)
这是情节: