2015-12-16 17 views
0

我有如下数据:重新排序不gpplot正与多面

LETTER   ID NUMBER 
1  A 805qhau1hbnm1 0.001 
2  A 47s11wwxy8x7c 0.521 
3  A 92g6022uvxtmf 0.036 
4  A 92pkgg5y0gvkk 0.002 
5  B gxx44abszy02j 0.066 
6  B agupupsu0gq26 0.001 
7  B 92g6022uvxtmf 0.003 
8  B 92g6022uvxtmf 0.003 
9  B agupupsu0gq26 0.004 
10  B dwvprfgxafqct 0.058 
11  B 92pkgg5y0gvkk 0.161 
12  B 2264vrpp4b02v 0.444 
13  B 92g6022uvxtmf 0.084 
14  B 1ypga6ay26dyk 0.018 
15  B 9tkrv34jdmvtk 0.414 
16  B agupupsu0gq26 0.001 
17  B agupupsu0gq26 0.002 
18  B gxx44abszy02j 0.065 
19  B 0mtz8hnvvm63r 0.012 
20  B 9ta79k8xtyzdy 0.006 
21  B 92g6022uvxtmf 0.014 
22  A 47s11wwxy8x7c 0.539 
23  A 92g6022uvxtmf 0.028 
24  A 92pkgg5y0gvkk 0.003 
25  A 92pkgg5y0gvkk 0.002 
26  A 805qhau1hbnm1 0.001 
27  A fmubqnkxnj16f 0.451 
28  B 448pxv1p0ffjp 0.040 
29  B 3cj2kj0rx311k 0.012 
30  B 9ta79k8xtyzdy 0.006 
31  B gxx44abszy02j 0.064 
32  B agupupsu0gq26 0.002 
33  B agupupsu0gq26 0.001 
34  A 92pkgg5y0gvkk 0.002 
35  A 65a353h1x9yfd 0.055 
36  B dbrx980zu7bmk 0.009 

而且我有以下ggplot代码:

l_myPlot  <- (ggplot(data  = l_data 
         , aes(x  = reorder(x = ID, X = NUMBER, sum, order = TRUE) 
           , y  = NUMBER 
         ) 
       ) 
       + geom_bar(stat = 'identity') 
       + facet_wrap(~ LETTER 
          , scales = "free_x" 
          ) 
       + theme (axis.text.x = element_text(angle = 90, hjust = 1)) 
       + scale_y_continuous() 
       ) 

正如你所看到的,我重新排序x轴基于在号码栏的添加(第2行)。问题是排序没有正确完成。请看A方面,ID 92...vkk应该是顺序中的第二个小节,而不是第四个。

enter image description here

+0

我们无法使用您的数据集。我试过你的代码,并且似乎在工作。也许你可以使用dput()来使你的数据集可用。 – MLavoie

+1

数据集对我来说工作得很好 - 复制到Excel并保存为csv。 – Mist

+0

@Heroka请精心制作 –

回答

3

我的方法是使用因素订购创造出来LETTER和ID的一个新的标识符,然后使用scale_x_discrete(标签=)以改变x轴标签。

library(ggplot2) 
library(dplyr) 
# summarise the data 
ld <- l_data %>% group_by(LETTER, ID) %>% transmute(sum = sum(NUMBER)) 
ld <- ld[!duplicated(ld) ,] 
# Sort in correct order 
ld <- ld[with(ld, order(LETTER, sum)) ,] 
# Factor in the sorted order 
ld$new_ID <- factor(paste(ld$LETTER, ld$ID), 
        levels = paste(ld$LETTER, ld$ID)) 
# Plot 
l_myPlot  <- ggplot() + 
    geom_bar(data = ld, 
      aes(x = new_ID, 
       y = sum), 
      stat = 'identity') + 
    facet_wrap(~ LETTER 
       , scales = "free_x" 
) + 
    scale_x_discrete(labels=ld$ID) + 
    theme (axis.text.x = element_text(angle = 90, hjust = 1)) + 
    scale_y_continuous() 
l_myPlot 
+0

谢谢@ Richo64,它是一个不错的主意,但我喜欢它只基于一个因素:) –

+1

@andresAlvarado我已经修改了答案,现在在x轴上给出正确的值。希望这是你以后的样子。 – Mist

+0

非常感谢Richo。这使它。感谢你的帮助。 –