2017-05-09 44 views
2

我試圖手動重新排列每個方面內的x軸標籤。ggplot中的每個方面手動訂購x軸標籤

的數據如下:

df = structure(list(block = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 
4L, 4L, 4L, 4L, 4L, 5L, 5L, 5L, 5L, 5L, 5L, 5L), .Label = c("1", 
"2", "3", "4", "5"), class = "factor"), item = structure(c(14L, 
15L, 28L, 29L, 30L, 31L, 32L, 15L, 16L, 17L, 18L, 19L, 20L, 21L, 
15L, 22L, 23L, 24L, 25L, 26L, 27L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 
1L, 8L, 9L, 10L, 11L, 12L, 13L), .Label = c("p00e00d00", "p00e00d11", 
"p00e00d12", "p00e00d13", "p00e00d21", "p00e00d22", "p00e00d23", 
"p00e11d00", "p00e12d00", "p00e13d00", "p00e21d00", "p00e22d00", 
"p00e23d00", "p01e00d00", "p11e00d00", "p11e00d11", "p11e00d12", 
"p11e00d13", "p11e00d21", "p11e00d22", "p11e00d23", "p11e11d00", 
"p11e12d00", "p11e13d00", "p11e21d00", "p11e22d00", "p11e23d00", 
"p12e00d00", "p13e00d00", "p14e00d00", "p21e00d00", "p22e00d00" 
), class = "factor"), response = structure(c(2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("2", 
"1"), class = "factor"), n = c(345L, 511L, 583L, 613L, 612L, 
222L, 142L, 531L, 546L, 589L, 636L, 478L, 364L, 313L, 502L, 533L, 
587L, 603L, 385L, 298L, 263L, 518L, 546L, 563L, 593L, 435L, 351L, 
310L, 478L, 579L, 629L, 646L, 357L, 307L, 230L), freq = c(0.408284023668639, 
0.604733727810651, 0.689940828402367, 0.725443786982249, 0.724260355029586, 
0.262721893491124, 0.168047337278107, 0.628402366863905, 0.646153846153846, 
0.697041420118343, 0.752662721893491, 0.565680473372781, 0.430769230769231, 
0.370414201183432, 0.594082840236686, 0.630769230769231, 0.694674556213018, 
0.713609467455621, 0.455621301775148, 0.352662721893491, 0.311242603550296, 
0.61301775147929, 0.646153846153846, 0.666272189349112, 0.701775147928994, 
0.514792899408284, 0.415384615384615, 0.366863905325444, 0.565680473372781, 
0.685207100591716, 0.744378698224852, 0.764497041420118, 0.422485207100592, 
0.363313609467456, 0.272189349112426)), class = c("tbl_df", "tbl", 
"data.frame"), row.names = c(NA, -35L), .Names = c("block", "item", 
"response", "n", "freq")) 

有五個塊,每個塊包含7個項目,並且一些項目具有跨越塊相同的名稱。因此,我可以通過塊突間如下:

df %>% 
    ggplot(aes(x = item, y = freq)) + 
    geom_bar(stat = "identity", position = "dodge", color = "black") + 
    facet_grid(.~block, scales = "free") + 
    coord_cartesian(ylim = c(0, 1), expand = F) + # need to add expanse = F to prevent zooming away 
    scale_y_continuous(labels = scales::percent) + 
    theme(axis.text.x = element_text(angle=45, hjust=1, vjust=1)) 

我也有針對每個規定的載體塊的項目應該出現的順序。例如:

block_3_order = c("p11e13d00","p11e12d00", "p11e11d00", "p11e00d00", "p11e21d00", "p11e22d00","p11e23d00") 
      ) 
block_4_order = c("p00e00d13", "p00e00d12", "p00e00d11", "p00e00d00", "p00e00d21","p00e00d22","p00e00d23") 
      ) 

我試圖重新排序「項「因素,但爲了獲得理想的效果,我需要將數據框分成表示塊的子集。否則,我很難理解如何將各種因素的排序與ggplot處理項目整合爲一個單一的因素。

任何幫助,非常感謝。

回答

3

要在每個方面獲得不同的自定義軸順序,您可以將每個「方面」創建爲單獨的情節,然後將它們放在一起,就好像它們是單面情節一樣。

library(tidyverse) 
#devtools::install_github("baptiste/egg") 
library(egg) 
library(gridExtra) 
library(grid) 
theme_set(theme_bw()) 

首先,創建自定義排序。那些是NULL的將在最終的圖中按字母順序排序。

b.order = list(b1 = NULL, 
       b2 = NULL, 
       b3 = c("p11e13d00","p11e12d00", "p11e11d00", "p11e00d00", "p11e21d00", "p11e22d00","p11e23d00"), 
       b4 = c("p00e00d13", "p00e00d12", "p00e00d11", "p00e00d00", "p00e00d21","p00e00d22","p00e00d23"), 
       b5 = NULL) 

創建一個陰謀列表,每個block一個。我們通過df分開block來做到這一點。要獲得自定義訂單,我們使用factor來根據列表b.order設置自定義訂單。

plist = map2(split(df, df$block), b.order, 
    ~ .x %>% group_by(block) %>% 
     mutate(item = factor(item, levels=if(is.null(.y)) sort(unique(item)) else .y)) %>% 
     ggplot(aes(x = item, y = freq)) + 
     geom_bar(stat = "identity", position = "dodge", color = "black") + 
     facet_grid(.~block, scales = "free") + 
     coord_cartesian(ylim = c(0, 1), expand = F) + # need to add expanse = F to prevent zooming away 
     scale_y_continuous(labels = scales::percent) + 
     theme(axis.text.x = element_text(angle=45, hjust=1, vjust=1), 
      plot.margin=margin(b=-5)) + 
     labs(x="")) 

刪除y軸標籤,標題,並從所有蜱,但最左邊的情節:

plist[2:length(plist)] = plist[2:length(plist)] %>% 
    map(~ .x + theme(axis.text.y=element_blank(), 
        axis.title.y=element_blank(), 
        axis.ticks.y=element_blank())) 

安排情節。我們使用egg軟件包中的ggarrange來確保繪圖面板都具有相同的水平寬度。我們還需要在劇情下添加Item標籤。但是,ggarrange會將圖輸出到輸出設備,即使在arrangeGrob內也是如此。因此,我們創建對象p,清除設備,然後重繪最終的情節。

p = arrangeGrob(ggarrange(plots=plist, ncol=length(plist)), 
       textGrob("Item"), heights=c(20,1)) 
grid.newpage() 
grid.draw(p) 

enter image description here

+0

這是一個奇妙的答案,我真的很感激上刪除所有的技巧,但最左邊的軸和ggarrange。謝謝! –