R (ggplot2) 中的堆积条形图,其中 y 轴和条形占计数的百分比

Stacked bar chart in R (ggplot2) with y axis and bars as percentage of counts

提问人:Steve 提问时间:9/1/2010 最后编辑:PatrickTSteve 更新时间:5/17/2016 访问量:27639

问:

我是 ggplot2 的新手,对生成堆积条形图有疑问。我检查了这本书和专用网页,但无法解决问题。我有两个因素,其中一个有 2 个级别(存在-缺席),其他 10 个级别。我们称这两个为“变量”和“果实”。

我想创建一个堆叠条形图,其中每个条形图反映一种水果,并且“变量”中的存在-不存在观测值的数量相互堆叠。这相对容易(参见下面的图 1 代码),但我也希望条形和 y 轴将“可变”中存在-不存在的计数表示为百分比。换言之,所有条形的高度应相同(总共反映 100%),并且存在-不存在观测值的计数应转换为百分比。

我可以使用 .. 将 y 轴刻度更改为百分比。计数。。*100/和(..计数..)但我无法理解如何转换实际的柱线。我创建了另一个带有分面的图(下面的图 2 代码),它在百分比方面实现了我想要的,但我更喜欢两个条形相互叠加。有没有人知道如何实现这一目标?我提供了虚拟数据和可重现的示例。感谢您的帮助。

史蒂夫

dat <- data.frame( fruit=c("Apple", "Apple", "Orange", "Orange", "Orange", "Orange",
                   "Orange", "Pear", "Pear", "Pear"), variable=c("Present", "Absent",
                   "Present", "Present", "Present", "Present", "Absent", "Absent",
                   "Absent", "Present") )  

# stacked bar plot  
ggplot(dat, aes(x = fruit, fill = variable) ) +  
    geom_bar( aes(y = ..count..*100/sum(..count..) ) ) +
    xlab("Fruit") +
    ylab("Would like this to be percentage") + 
    scale_fill_manual("Condition", values = alpha( c("firebrick", "dodgerblue4"), 1) )  

enter image description here

# with faceting  
ggplot(dat, aes(x = variable, fill = variable) ) +   
    geom_bar( aes(y = ..count..*100/sum(..count..) ) ) +   
    facet_grid(. ~ fruit) +  
    xlab("Fruit") +
    ylab("Would like this to be percentage") + 
    scale_fill_manual("Condition", values = alpha( c("firebrick", "dodgerblue4"), 1) )  

enter image description here

r ggplot2

评论


答:

26赞 Ramnath 9/1/2010 #1

对于第一张图,只需将 position = 'fill' 添加到geom_bar行 !。您实际上不需要缩放计数,因为 ggplot 有一种方法可以自动执行此操作。

ggplot(dat, aes(x = fruit)) + geom_bar(aes(fill = variable), position = 'fill')

评论

0赞 Steve 9/1/2010
谢谢Ramnath,这正是我需要的酒吧。但是,当我这样做时,y 轴标签恢复为 0 到 1 的刻度。我希望它们是 0 到 100。包括 y = ..计数。。*100 或 y = ..密度。。*“AES”中的 100 似乎不起作用。有什么想法吗?
4赞 James 9/2/2010
+ scale_y_continuous("",formatter="percent").首字母去掉了“count”标签,但你可以包含任何你想要的标签。""
1赞 Steve 9/2/2010
绘图现在看起来很棒,但在我的真实数据集中有 NA,ggplot 默认将它们解释为另一个因子水平。有没有办法在绘图函数中关闭它(或删除 NA),以便绘图忽略 NA 并仅绘制 100% 的其他两个级别?谢谢。
1赞 Ramnath 9/3/2010
史蒂夫。如果要删除所有 NA,则可以在 ggplot 调用中使用 na.omit(data)。这将传递一个删除所有 NA 的数据帧。
3赞 atomicules 5/17/2012
有关百分比格式化程序的语法更改,请参阅此处。上面的评论不再有效:stackoverflow.com/questions/10146109/......