Я могу сделать это, предварительно обработав данные, но не полностью в пределах одного ggplot
вызова.
library("plyr")
mt <- ddply(mtcars, .(cyl, vs), summarise, n=length(cyl))
mt <- ddply(mt, .(cyl), mutate, nfrac = n/sum(n), width = sum(n))
mt$width <- mt$width / max(mt$width)
Набор данных mt
теперь имеет все необходимое для построения графика:
> mt
cyl vs n nfrac width
1 4 0 1 0.09090909 0.7857143
2 4 1 10 0.90909091 0.7857143
3 6 0 3 0.42857143 0.5000000
4 6 1 4 0.57142857 0.5000000
5 8 0 14 1.00000000 1.0000000
и вызов ggplot
будет выглядеть как
ggplot(mt, aes(x=factor(cyl), fill=factor(vs), y=nfrac)) +
geom_bar(aes(width=width), position="stack", stat="identity")
Он выдает предупреждение:
Warning message:
position_stack requires constant width: output may be incorrect
, но создает сюжет:
![enter image description here](https://i.stack.imgur.com/096kY.png)