我正在绘制一个分类变量,而不是显示每个类别值的计数.
我正在寻找一种方法来ggplot显示该类别中的值的百分比.当然,有可能用计算的百分比创建另一个变量并绘制一个变量,但我必须做几十次,我希望在一个命令中实现它.
我正在尝试类似的东西
qplot(mydataf) +
stat_bin(aes(n = nrow(mydataf), y = ..count../n)) +
scale_y_continuous(formatter = "percent")
Run Code Online (Sandbox Code Playgroud)
但我必须错误地使用它,因为我有错误.
为了轻松重现设置,这里有一个简化的例子:
mydata <- c ("aa", "bb", NULL, "bb", "cc", "aa", "aa", "aa", "ee", NULL, "cc");
mydataf <- factor(mydata);
qplot (mydataf); #this shows the count, I'm looking to see % displayed.
Run Code Online (Sandbox Code Playgroud)
在实际情况中,我可能会使用ggplot而不是qplot,但使用stat_bin的正确方法仍然无法使用.
我也试过这四种方法:
ggplot(mydataf, aes(y = (..count..)/sum(..count..))) +
scale_y_continuous(formatter = 'percent');
ggplot(mydataf, aes(y = (..count..)/sum(..count..))) +
scale_y_continuous(formatter = 'percent') + geom_bar();
ggplot(mydataf, aes(x = levels(mydataf), y = …Run Code Online (Sandbox Code Playgroud) 我有三个ExperimentCohort因素确定的学生群体.对于每个学生,我有一个LetterGrade,也是一个因素.我想LetterGrade为每个人绘制一个类似直方图的条形图ExperimentCohort.运用
ggplot(df, alpha = 0.2,
aes(x = LetterGrade, group = ExperimentCohort, fill = ExperimentCohort))
+ geom_bar(position = "dodge")
Run Code Online (Sandbox Code Playgroud)
让我非常接近,但这三个ExperimentCohorts学生的数量并不相同.为了在更均匀的场上比较这些,我希望y轴是每个字母等级的队列中的比例.到目前为止,还没有计算这个比例,并在绘图之前将其放在一个单独的数据框中,我还没有找到办法做到这一点.
SO和其他地方的类似问题的每个解决方案都涉及aes(y = ..count../sum(..count..)),但sum(.. count ..)在整个数据帧中执行,而不是在每个队列中执行.有人有建议吗?这是创建示例数据帧的代码:
df <- data.frame(ID = 1:60,
LetterGrade = sample(c("A", "B", "C", "D", "E", "F"), 60, replace = T),
ExperimentCohort = sample(c("One", "Two", "Three"), 60, replace = T))
Run Code Online (Sandbox Code Playgroud)
谢谢.
我正在寻找有关更好地绘制各类观测比例的建议.
我有一个看起来像这样的数据框:
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)
但我不想要"总和(......计数......)" - 它给出了所有箱子的总和- …
如何在ggplot2中使用填充美学来绘制两组的相对比例?
我在这里问这个问题,因为关于这个主题的其他几个答案似乎不正确(ex1,ex2和ex3),但是Cross Validated似乎在功能上禁止了R特定问题(CV meta). ..density..在概念上与比例相关,但与比例不同(ex4和ex5).所以正确答案似乎不涉及密度.
例:
set.seed(1200)
test <- data.frame(
test1 = factor(sample(letters[1:2], 100, replace = TRUE,prob=c(.25,.75)),ordered=TRUE,levels=letters[1:2]),
test2 = factor(sample(letters[3:8], 100, replace = TRUE),ordered=TRUE,levels=letters[3:8])
)
ggplot(test, aes(test2)) + geom_bar(aes(y = ..density.., group=test1, fill=test1) ,position="dodge")
#For example, the plotted data shows level a x c as being slightly in excess of .15, but a manual calculation shows a value of .138
counts <- with(test,table(test1,test2))
counts/matrix(rowSums(counts),nrow=2,ncol=6)
Run Code Online (Sandbox Code Playgroud)
似乎产生正确输出的答案适用于不使用ggplot2(在ggplot2之外计算它)的解决方案,或者需要使用面板而不是填充美学. …