如果我执行以下命令
data(mtcars)
ggplot(data=mtcars, aes(cyl))+
geom_bar(aes(fill=as.factor(gear), y = (..count..)/sum(..count..)), position="dodge") +
scale_y_continuous(labels=percent)
但是,我真正想做的是让每个gear
级别加起来达到100%。所以,gear
是我正在查看的子组,我想知道每个组内的分布。
我不想使用facets
,我也不想融化数据。有没有办法做到这一点?
答案 0 :(得分:5)
我正在寻找这个确切问题的答案。这就是我使用Stack Overflow汇集在一起的信息,并从{{.. ..,.. group ..和..count ..中获取熟悉的信息(即试错) Simon的回答中提供了{3}}链接。除了ggplot之外,它不应该需要任何其他软件包。
library(ggplot2)
ggplot(mtcars, aes(x=as.factor(cyl), fill=as.factor(gear)))+
geom_bar(aes( y=..count../tapply(..count.., ..x.. ,sum)[..x..]), position="dodge" ) +
geom_text(aes( y=..count../tapply(..count.., ..x.. ,sum)[..x..], label=scales::percent(..count../tapply(..count.., ..x.. ,sum)[..x..]) ),
stat="count", position=position_dodge(0.9), vjust=-0.5)+
ylab('Percent of Cylinder Group, %') +
scale_y_continuous(labels = scales::percent)
可生产 Sebastian Sauer
答案 1 :(得分:1)
首先:您的代码对我来说是不可复制的(即使包括library(ggplot2)
之后也是如此)。我不确定..count..
是否是一种我不知道的花哨语法,但无论如何,如果我能够立即复制它会更好: - )。
话虽如此,我认为您正在寻找的内容在http://docs.ggplot2.org/current/geom_bar.html中描述,并将代码应用于您的示例
library(ggplot2)
data(mtcars)
mtcars$gear <- as.factor(mtcars$gear)
ggplot(data=mtcars, aes(cyl))+
geom_bar(aes(fill=as.factor(gear)), position="fill")
产生
这是你在找什么?
事后补充:学习melt()
或其替代品是必须的。但是,来自melt()
的{{1}} reshape2
来自gather()
来自tidyr
的大多数用例。
答案 2 :(得分:1)
以下是有关如何从Sebastian Sauer执行此操作的良好资源。解决问题的最快方法是方式4,其中..prop..
代替(..count..)/sum(..count)
:
# Dropping scale_y_continuous, since you do not define percent
ggplot(data=mtcars, aes(cyl))+
geom_bar(aes(fill=as.factor(gear), y = (..count..)/sum(..count..)),
position="dodge")
我使用的另一种方法与链接页面中的方式1类似,是使用dplyr
来计算百分比,并使用stat = 'identity'
在条形图中使用y
美学图:
mtcars %>%
mutate(gear = factor(gear)) %>%
group_by(gear, cyl) %>%
count() %>%
group_by(gear) %>%
mutate(percentage = n/sum(n)) %>%
ggplot(aes(x = cyl, y = percentage, fill = gear)) +
geom_bar(position = 'dodge', stat = 'identity')