我想创建一个像这样的条形图:
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
的后续跟进答案 0 :(得分:1)
您可以使用sjPlot-package中的sjp.xtab
:
sjp.xtab(diamonds$clarity,
diamonds$cut,
showValueLabels = F,
tableIndex = "row",
barPosition = "stack")
总计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)
修改:这个使用2
和prop.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")
使用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
...)