在ggplot中从最小到最大排序堆积条形图的条形

时间:2011-11-11 17:15:46

标签: r ggplot2

有没有办法指定我希望堆积条形图的条形图与ggplot按照从最小到最大的四个因子的总和排序? (所以在下面的代码中,我想按所有变量的总和排序)我有一个数据帧中每个x值的总和,我融化了这个值以创建从中形成图形的数据帧。

我用来绘制图表的代码是:

ggplot(md, aes(x=factor(fullname), fill=factor(variable))) + geom_bar()

我目前的图表如下:

http://i.minus.com/i5lvxGAH0hZxE.png

最终结果是我希望有一个看起来有点像这样的图表:

http://i.minus.com/kXpqozXuV0x6m.jpg

我的数据如下:

data in chart http://i.minus.com/izAmjF47yfsRQ.png

我把它融合到这个表格中,每个学生都有每个类别的价值:

melted data http://i.minus.com/i1rf5HSfcpzri.png

在使用以下行进行图表化之前

       ggplot(data=md, aes(x=fullname, y=value, fill=variable), ordered=TRUE) + geom_bar()+ opts(axis.text.x=theme_text(angle=90)) 

现在,我不确定我是否了解Chi的排序方式,以及是否可以将其应用于我所拥有的任何一帧的数据。也许在我拥有的原始数据框架中对数据进行排序是有帮助的,这是我首先显示的数据框架。

更新:我们明白了。请参阅此主题以获得答案: Order Stacked Bar Graph in ggplot

1 个答案:

答案 0 :(得分:6)

我不确定您的数据生成方式(即,您是否使用reshape包中的cast / melt组合,这是我怀疑给定的变量的默认名称),但这是一个玩具示例,其中排序是在ggplot的调用之外完成的。可能有更好的方法,按照@Andy的建议浏览SO。

v1 <- sample(c("I","S","D","C"), 200, rep=T)
v2 <- sample(LETTERS[1:24], 200, rep=T)
my.df <- data.frame(v1, v2)
idx <- order(apply(table(v1, v2), 2, sum))

library(ggplot2)
ggplot(my.df, aes(x=factor(v2, levels=LETTERS[1:24][idx], ordered=TRUE),
       fill=v1)) + geom_bar() + opts(axis.text.x=theme_text(angle=90)) +
       labs(x="fullname")

要反向排序,请使用decr=TRUE命令添加order。另外,正如@Andy建议的那样,您可以通过添加+ coord_flip()而不是opts()选项来克服x标签重叠的问题。

enter image description here