每个栏的宽度不同,在ggplot2中使用geom_bar和“position = fill”

时间:2012-03-04 15:53:56

标签: r ggplot2 bar-chart

你能否告诉我是否可以制作条形高度标准化为1的条形图,但条形宽度与每个区域中的元素数量成比例。

示例:此图

ggplot(mtcars, aes(x=factor(cyl), fill=factor(vs))) + geom_bar(position="fill")

然后使3个条的宽度与

成比例
table(factor(mtcars$cyl))

在position_fill()中有“width”参数,但它必须是常量,不是吗?

谢谢,

弗朗索瓦

编辑:

我进一步尝试了,并得到消息:“position_fill需要恒定宽度”

所以我想要得到我想要的东西是不可能的,至少使用geom_bar。

2 个答案:

答案 0 :(得分:2)

我可以通过预处理数据来完成,但不是完全在一次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

答案 1 :(得分:1)

这是你想要的吗?

library(ggplot2)
ggplot(mtcars, aes(x=factor(cyl), fill=factor(vs))) + geom_bar(position="fill") + coord_flip()

enter image description here