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

我正在寻找一种方法来让ggplot显示该类别中值的百分比。当然,可以用计算出的百分比创建另一个变量并绘制该变量,但我必须这样做几十次,我希望在一个命令中实现这一点。

我在做一些实验,比如

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个都给予:

错误:ggplot2不知道如何处理类因子的数据

的简单情况也会出现相同的错误

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

这显然是关于ggplot如何与单个向量交互的。我摸不着头脑,在谷歌上搜索这个错误只得到一个结果。


当前回答

在回答了这个问题之后,ggplot语法有了一些有意义的更改。总结一下上面评论中的讨论:

 require(ggplot2)
 require(scales)

 p <- ggplot(mydataf, aes(x = foo)) +  
        geom_bar(aes(y = (..count..)/sum(..count..))) + 
        ## version 3.0.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) ## version 3.0.0

这个问题目前在谷歌上的“ggplot计数vs百分比直方图”中排名第一,所以希望这有助于提取目前在对公认答案的评论中包含的所有信息。

注:如果hp没有被设置为因子,ggplot返回:

其他回答

修改后的代码应该可以工作

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

如果你的数据有NAs,而你不希望它们包含在plot中,将na.省略(mydataf)作为参数传递给ggplot。

希望这能有所帮助。

截至2017年3月,对于ggplot2 2.2.1,我认为最佳解决方案在Hadley Wickham的R for数据科学书籍中得到了解释:

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

Stat_count计算两个变量:默认使用count,但您可以选择使用显示比例的prop。

在回答了这个问题之后,ggplot语法有了一些有意义的更改。总结一下上面评论中的讨论:

 require(ggplot2)
 require(scales)

 p <- ggplot(mydataf, aes(x = foo)) +  
        geom_bar(aes(y = (..count..)/sum(..count..))) + 
        ## version 3.0.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) ## version 3.0.0

这个问题目前在谷歌上的“ggplot计数vs百分比直方图”中排名第一,所以希望这有助于提取目前在对公认答案的评论中包含的所有信息。

注:如果hp没有被设置为因子,ggplot返回:

如果你想在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()
  )

对于ggplot2 2.1.0版本,就是这样

+ scale_y_continuous(labels = scales::percent)