我正在寻找有关更好地绘制各类观测比例的建议.
我有一个看起来像这样的数据框:
cat1 <- c("high", "low", "high", "high", "high", "low", "low", "low", "high", "low", "low")
cat2 <- c("1-young", "3-old", "2-middle-aged", "3-old", "2-middle-aged", "2-middle-aged", "1-young", "1-young", "3-old", "3-old", "1-young")
df <- as.data.frame(cbind(cat1, cat2))
Run Code Online (Sandbox Code Playgroud)
在这里的例子,我要绘制的比例各年龄组的有值"高",而且比例各年龄组的有值"低".更一般地说,我想为类别2的每个值绘制属于第1类每个级别的观察百分比.
以下代码生成正确的结果,但只能通过在绘图之前手动计数和分割.有什么好的方法可以在ggplot中动态执行此操作吗?
library(plyr)
count1 <- count(df, vars=c("cat1", "cat2"))
count2 <- count(df, "cat2")
count1$totals <- count2$freq
count1$pct <- count1$freq / count1$totals
ggplot(data = count1, aes(x=cat2, y=pct))+
facet_wrap(~cat1)+
geom_bar()
Run Code Online (Sandbox Code Playgroud)
这个以前的stackoverflow问题提供了类似的东西,代码如下:
ggplot(mydataf, aes(x = foo)) +
geom_bar(aes(y = (..count..)/sum(..count..)))
Run Code Online (Sandbox Code Playgroud)
但我不想要"总和(......计数......)" - 它给出了所有箱子的总和- 在分母中; 相反,我想要每个"cat2"类别的计数总和.我还研究了stat_bin文档.
如果有任何关于如何使这项工作的提示和建议,我将不胜感激.
jor*_*ran 41
我会理解,如果这不是你想要的,但我发现你对你想要的东西的描述非常混乱,直到我意识到你只是想以一种对我来说看起来非常不自然的方式想象你的数据.
如果有人让我生成每个类别中比例的图表,我可能会转向分段条形图:
ggplot(df,aes(x = cat2,fill = cat1)) +
geom_bar(position = "fill")
Run Code Online (Sandbox Code Playgroud)

请注意,y轴可以根据需要记录比例,而不是计数.
这对你来说可能有点晚了,它不涉及ggplot,但是:
我认为镶嵌图是可视化两个因素相互作用的前进方向:
cat1 <- c("high", "low", "high", "high", "high", "low", "low", "low", "high", "low", "low")
cat2 <- c("1-young", "3-old", "2-middle-aged", "3-old", "2-middle-aged", "2-middle-aged", "1-young", "1-young", "3-old", "3-old", "1-young")
df <- as.data.frame(cbind(cat1, cat2))
mosaicplot(cat2 ~ cat1, data = df, col = c(lightskyblue2', 'tomato'))
Run Code Online (Sandbox Code Playgroud)
在该图中,每个值对的框根据该类别中的观察数量进行缩放.您可以提供颜色矢量以辅助可视化.