【问题标题】:Stacked bar chart in R (ggplot2) with y axis and bars as percentage of countsR(ggplot2)中的堆叠条形图,y轴和条形图占计数的百分比
【发布时间】:2010-09-01 14:22:57
【问题描述】:

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

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

我可以使用 ..count..*100/sum(..count..) 将 y 轴比例更改为百分比,但我无法理解如何转换实际条形。我创建了另一个带有刻面的图(下面图 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) )  

# 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) )  

【问题讨论】:

    标签: r ggplot2


    【解决方案1】:

    对于第一个图表,只需将 position = 'fill' 添加到您的 geom_bar 行!。您实际上不需要缩放计数,因为 ggplot 可以自动进行。

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

    【讨论】:

    • 感谢 Ramnath,这正是我需要的酒吧。但是,当我这样做时,y 轴标签会恢复为 0 到 1 的比例。我希望它们为 0 到 100。在“aes”中包含 y = ..counts..*100 或 y = ..density..*100 似乎不起作用。有什么想法吗?
    • + scale_y_continuous("",formatter="percent")。最初的 "" 去掉了“计数”标签,但您可以包含任何您想要的标签。
    • 该图现在看起来不错,但在我的真实数据集中有 NA,ggplot 默认将这些解释为另一个因子水平。有没有办法在绘图函数中关闭它(或删除 NA),以便绘图忽略 NA 并仅将其他两个级别绘制为 100%?谢谢。
    • 史蒂夫。如果要删除所有 NA,则可以在 ggplot 调用中使用 na.omit(data) 。这将传递一个删除所有 NA 的数据框。
    • 请参阅此处以了解有关百分比格式化程序的语法更改。以上评论不再有效:stackoverflow.com/questions/10146109/…
    猜你喜欢
    • 2018-12-15
    • 1970-01-01
    • 2013-05-18
    • 1970-01-01
    • 2018-12-09
    • 2014-12-08
    • 2017-08-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多