2012-09-16 272 views
3

可能重複:
Order Bars in ggplot2 bar graph分組酒吧在GGPLOT2

我有一個數據集,我想有一個ggplot酒吧情節描繪的比例爲變量之一,根據另一個變量對條進行排序或排序。這是一個數據集的例子。

grouping,category,domain 
6,W,ced0.11 
1,none,ced1.1 
2,none,ced1.1 
3,Z,ced1.5 
2,Z,ced1.7 
3,Z,ced1.3 
3,none,ced1.6 
2,none,ced1.1 
1,Z,ced1.1 
4,none,ced0.8 
4,W,ced0.6 
4,W,ced0.6 
2,Z,ced1.5 
2,W,ced1.6 
4,Y,ced0.16 
3,Z,ced1.5 
4,Y,ced0.15 
4,W,ced0.15 
4,Y,ced0.24 
6,W,ced0.8 
4,Y,ced0.4 
4,none,ced0.19 
4,W,ced0.5 
4,W,ced0.10 
4,W,ced0.9 
4,W,ced0.3 
1,Z,ced1.6 
4,W,ced0.9 
4,W,ced0.15 
1,Z,ced1.1 
4,Y,ced0.19 
6,W,ced0.4 
4,W,ced0.16 
4,W,ced0.6 
4,W,ced0.5 
2,Z,ced1.7 
4,W,ced0.9 
4,Y,ced0.1 
4,W,ced0.2 
4,Y,ced0.21 
2,W,ced0.3 
4,Y,ced0.21 
4,W,ced0.10 
1,Z,ced1.2 
4,Y,ced0.16 
1,Z,ced1.2 
1,Z,ced1.2 
5,W,ced0.23 
4,Y,ced0.1 

以下代碼用於導入和顯示條形圖。

library(ggplot2) 
ex1.dta <- read.csv("../../Datasets/ex1.txt",sep=",",header=TRUE) 

#sort the data frame 
ex1.dta2 <- transform(ex1.dta,domain=reorder(domain,category)) 

ggplot(ex1.dta2,aes(domain,fill=category)) + 
    geom_bar(position="fill") + 
    scale_y_continuous(name="Proportion") + 
    scale_x_discrete(name="domains") + 
    scale_fill_manual(values=c("#841108","#16a4e9","#a4a42a","#eb96ed","grey"),name="category") + 
    theme_bw() + 
    opts(
    axis.text.x=theme_text(angle=-90,hjust=0), 
    axis.line = theme_segment(colour = "black"), 
    panel.grid.major = theme_blank(), 
    panel.grid.minor = theme_blank(), 
    panel.border = theme_blank()) + 
    geom_vline(xintercept = 0) 

enter image description here

當我使用變換訂購數據幀,我得到警告,並且不執行排序/排序。我真正想要的是排序,使得每個類別的條形圖都沿x軸分組在一起(並按降序排列)。 (所有褐色條紋在一起,以淺藍色和「分層方式」等等)。

我該如何實現這一目標?我需要多次訂購嗎?任何想法?

+1

您是否閱讀過'?reorder'的文檔?具體來說,你期望''category'的_averaging_值的子集有什麼意義? – joran

+0

謝謝joram。哦,所以重新排序通常需要一個數字變量。但是當你有上述情況時,推薦的方法是什麼? – eastafri

+0

facet_grid不會產生所需的結果。隨着更多類別出現,它也過於「冗長」。我只是喜歡一個解決方案來排序/重新排列在一個圖中的酒吧。 – eastafri

回答

1

我不完全知道你真正想要的訂貨,但你可以嘗試這樣的事:

ex1.dta2 <- transform(ex1.dta,domain=reorder(domain,category,FUN = function(x){ min(as.numeric(x)) })) 

結果將取決於如何category水平排列,所以你應該調整,如果這不是你想要的確切順序。在這種情況下,我得到如下圖:

enter image description here

這是怎麼回事是因素作爲整數代碼存儲在內部設置的標籤。因此,基於category因子重新排序,我只是通過一個匿名函數轉換爲整數代碼,然後選擇最小值。

+0

謝謝喬蘭!不過,我期望ced0.10,ced0.11,ced0.2,ced0.23,ced0.3,ced0.5,0.6和0.9的列彼此相鄰。 – eastafri

+0

@Biorelated每當你想要一個特定順序的因子的水平,你必須明確告訴R的順序。有這樣做的程序化方法(即'reorder'),但如果沒有這個,你只需要執行'ex1.dta2 < - factor(ex1.dta2 $ domain,levels = ...)',然後列出這些級別你想要的順序。 – joran