ggplot:显示%而不是具有多个级别的分类变量图表中的计数

时间:2015-04-15 11:14:30

标签: r ggplot2 bar-chart sjplot

我想创建一个像这样的条形图:

library(ggplot2)

# Dodged bar charts
ggplot(diamonds, aes(clarity, fill=cut)) + geom_bar(position="dodge")

然而,我希望通过削减类别('公平','好','非常好'......),而不是计数,我希望观察的百分比落入每个“清晰度”类别。

有了......

# Dodged bar charts
ggplot(diamonds, aes(clarity, fill=cut)) + 
geom_bar(aes(y = (..count..)/sum(..count..)), position="dodge")

我在y轴上获得百分比,但这些百分比忽略了削减因子。 我希望所有红色条总计为1,所有黄色条总计为1等。

是否有一种简单的方法可以在不必手动准备数据的情况下完成工作?

谢谢!

P.S。:这是对此stackoverflow question

的后续跟进

1 个答案:

答案 0 :(得分:1)

您可以使用sjPlot-package中的sjp.xtab

sjp.xtab(diamonds$clarity, 
         diamonds$cut, 
         showValueLabels = F, 
         tableIndex = "row", 
         barPosition = "stack")

enter image description here

总计100%的堆叠组百分比的数据准备应该是:

data.frame(prop.table(table(diamonds$clarity, diamonds$cut),1))

因此,你可以写

mydf <- data.frame(prop.table(table(diamonds$clarity, diamonds$cut),1))
ggplot(mydf, aes(Var1, Freq, fill = Var2)) + 
  geom_bar(position = "stack", stat = "identity") +
  scale_y_continuous(labels=scales::percent)

修改:这个使用2prop.table中的position = "dodge"将每个类别(公平,良好......)加到100%:< / p>

mydf <- data.frame(prop.table(table(diamonds$clarity, diamonds$cut),2))
ggplot(mydf, aes(Var1, Freq, fill = Var2)) + 
    geom_bar(position = "dodge", stat = "identity") +
    scale_y_continuous(labels=scales::percent)

sjp.xtab(diamonds$clarity, 
         diamonds$cut, 
         showValueLabels = F, 
         tableIndex = "col")

enter image description here

使用dplyr验证最后一个示例,总结每组中的百分比:

library(dplyr)
mydf %>% group_by(Var2) %>% summarise(percsum = sum(Freq))

>        Var2 percsum
> 1      Fair       1
> 2      Good       1
> 3 Very Good       1
> 4   Premium       1
> 5     Ideal       1

(有关sjp.xtab ...)

的更多情节选项和示例,请参阅this page