首页 文章

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

提问于
浏览
4

有没有办法指定我希望堆积条形图的条形图与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

我把它融化成这种形式,每个学生都有每个类别的 Value :

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 回答

  • 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")
    

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

    enter image description here

相关问题